[Netzlaufwerk] Überwachung eines Netzlaufwerks
spacer
Autor Nachricht
Nico B.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 2006 Prof.
BeitragVerfasst: Do 08.12.11 16:33 
Betrifft: Netzlaufwerk
Hallo Leute,

ich brauche dringend Hilfe bei einem etwas komplexeren Problem.
Ich muss regelmäßig Dateien von einem anderen Rechner im Netzwerk laden.
Dazu richte ich bei Programmstart ein Netzlaufwerk ein.

Ich möchte nun dafür sorge tragen, dass diese Verbindung immer besteht, bzw. bei einem Verbindungsabbruch so bald wie möglich wieder aufgebaut wird.

Habt ihr Ideen?

P.S. Ich erstelle ein Netzlaufwerk, weil ich nicht weiß, wie ich bei einem Dateizugriff über die Rechner-IP den Benutzernamen und das Passwort zu dem freigegebenen Laufwerk mitgeben kann. Falls das aber irgendwie geht, bräuchte ich nur noch die Netzwerkverbindung überwachen.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Nico B. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 2006 Prof.
BeitragVerfasst: Fr 09.12.11 10:32 
Hallo Leute,

fangen wir doch mit dem ersten Schritt an...
Wie erkenne ich, ob ein Netzlaufwerk verbunden ist?

Ich habe dazu folgende Funktion gefunden:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function GetNetworkDriveConnection(const Laufwerk,Verzeichnis: String): boolean;
var
lpnLength: Cardinal;
FuncResult: DWORD;
lpLocalName: PChar;
lpRemoteName: PChar;
RemoteName: String;
begin
lpLocalName:=AllocMem(MAX_PATH+1);
lpRemoteName:=AllocMem(MAX_PATH+1);
StrPCopy(lpLocalName,Laufwerk);
lpnLength:=MAX_PATH;
FuncResult:=WNetGetConnection(lpLocalName,lpRemoteName,lpnLength);
RemoteName:=lpRemoteName;
if (FuncResult=0) AND (Verzeichnis=RemoteName)
then
Result:=true
else
Result:=false;
FreeMem(lpLocalName);
FreeMem(lpRemotename);
end;

Mit meinem Programm verbinde ich nun also ein Netzlaufwerk.
Dann starte ich einen Timer der regelmäßig über obenstehende Funktion die Verbindung zu meinem Netzlaufwerk prüft.
Anschließend ziehe ich das Netzwerkkabel von meinem PC ab.
ABER: Keine Reaktion. Die Funktion bemerkt nicht, dass das Netzlaufwerk nicht mehr verbunden ist.

Woran liegt das?

Edit: baka0815 hat natürlich recht. Es muss WNetGetConnection heißen.


Zuletzt bearbeitet von Nico B. am Fr 09.12.11 14:44, insgesamt 1-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: Fr 09.12.11 12:00 
Ich vermute mal, dass die Funktion WNetGetConnection aufgerufen wird.
Diese holt den Namen der Netzwerkressource, die mit dem Laufwerk verbunden ist, prüft jedoch nicht ob die Verbindung auch tatsächlich besteht.

Vielleicht findest du hier eine Funktion die dir hilft.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nico B. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 2006 Prof.
BeitragVerfasst: Fr 09.12.11 14:51 
Hallo Leute,

ich habe mir die von baka0815 empfohlene Seite angeschaut.
Mittlerweile habe ich auch in der Delphi-Hilfe alles zu den Windows Networking Functions gefunden.
Leider jedoch nur in englisch.
Mit diesem ganzen fachspezifischen englisch komme ich aber nicht so gut zurecht.

Kennt jemand eine Funktion mit der nicht nur überprüft wird, ob die angegebene Netzwerkressource existiert, sondern ob die Verbindung auch besteht?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Tankard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 143
Erhaltene Danke: 22



BeitragVerfasst: Fr 09.12.11 15:35 
schau dir mal MultinetGetConnectionPerformance an. die gibt ne fehler zurueck, sollte die connection nicht bestehen.

Note that the MultinetGetConnectionPerformance function can be used only to request information for a local device that is redirected to a network resource, or for a network resource to which there is currently a connection.

ps:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
if (FuncResult=0) AND (Verzeichnis=RemoteName)
then
Result:=true
else
Result:=false;


ginge auch so:
ausblenden Delphi-Quelltext markieren
1:
  Result:=((FuncResult=0) AND (Verzeichnis=RemoteName));
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Administrator
Beiträge: 8371
Erhaltene Danke: 244

W2k, WXPpro
TP3 - D7pro
BeitragVerfasst: Sa 10.12.11 06:36 
Moin!

Ich frage mich, ob nicht ein anderes Protokoll als SMB die einfachere Lösung darstellt. :nixweiss:

Wie wäre es mit FTP, oder wenn nur Daten geholt werden sollen, auch HTTP? :idea: Notfalls auch ein eigener Client/Dienst, der die Daten zur Verfügung stellt. Hier ist die Fehlerbehandlung deutlich einfacher. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nico B. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36

Win XP
Delphi 2006 Prof.
BeitragVerfasst: Mo 12.12.11 10:50 
Hallo Leute,

Tankards Vorschlag hat mich auf die Lösung meines Problems gebracht.
Tatsächlich kann man die Funktion MulinetGetConnectionPerformance missbrauchen, um zu überprüfen, ob ein Netzlaufwerk verbunden ist.
Hier meine Lösung:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//Laufwerk = steht für den lokalen Laufwerksbuchstaben des Netzlaufwerks
//Verzeichnis = steht für den entfernten Pfad auf den zugegriffen werden soll
function GetNetworkDriveConnection(const Laufwerk,Verzeichnis: String): boolean;
var
LRes: TNetResource;
LInfo: TNetConnectInfoStruct;
begin
ZeroMemory(@LRes,SizeOf(LRes));
LRes.lpLocalName:=PChar(Laufwerk);
LRes.lpRemoteName:=PChar(Verzeichnis);
LInfo.cbStructure:=SizeOf(LInfo);
Result:=MultinetGetConnectionPerformance(@LRes,@LInfo)=NO_ERROR;
end;

Die Lösung habe ich übrigens hier gefunden.

Vielen Dank für eure Hilfe!!!
Problem gelöst!

Edit: Danke Tankard. Jetzt sollte es stimmen.


Zuletzt bearbeitet von Nico B. am Mo 12.12.11 14:30, insgesamt 1-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Tankard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 143
Erhaltene Danke: 22



BeitragVerfasst: Mo 12.12.11 12:47 
Hi,

deine ZeroMemory Zeile ist wohl falsch. Hoffe nur hier und nicht in deinem Code den du einsetzt.

Gruss
Tankard
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home