![]() |
2 Netzlaufwerkverbindungen in einem Service
Guten morgen Forum,
Gleich nach den Feiertagen klagt mich folgendes Problem: Ich habe einen Service programmiert, welcher ,um es einfach ausgedrückt, bestimmte Aufgaben zu bestimmten Zeitpunkten ausführt. Damit der Service auch in anderen Projekten relativ simpel benutzt werden kann, läd sich der Service die Prozeduren dynamisch aus DLL´s, deren Pfade in einer XML-Datei hinterlegt sind. Der Service wird bereits beim Kunden eingesetzt und arbeitet zufriedenstellend! Nun habe ich einen neuen Job, also eine neue DLL programmiert, die zur Arbeit ein Netzlaufwerk erstellen muss. Das realisiere ich folgendermaßen:
Delphi-Quellcode:
Das funktioniert soweit auch gut. Möchte ich jedoch diesen Job auf zwei unterschiedliche Netzwerkstandorte anwenden scheint ein Job sich beim Verbinden des Netzwerklaufwerkes abzuschießen. Leider ist das dank des Services und der DLL nicht so leicht zu debuggen!
library MyDLL;
var //Variablen Password: String; { Funktion zum Ausführen } function Run: PChar; stdcall; export; var Error: Integer; Msg: String; begin Error := 0; Msg := ''; try if CheckConnection(Msg) then begin //Mach etwas end else Error := 1; except on e: exception do Msg := e.Message; end; Result := PChar('['+IntToStr(Error)+']['+Msg+']'); end; { Überprüft die Netzlaufwerkverbindung } function CheckConnection(var AMsg: String): Boolean; begin Result := false; try If FileExists(Filepath+'\'+Filename) then Result := true else begin WNetCancelConnection2(PChar(DriveChar), 0, True); If NetzlaufwerkVerbinden(DriveChar,Filepath,Username,Password,false) = 0 then begin If FileExists(Filepath+'\'+Filename) then Result := true else AMsg := AMsg + Filename + ' kann nicht gefunden werden; '; end else begin AMsg := AMsg + 'Verbindung zu Netzlaufwerk fehlgeschlagen; '; Result := False; end; end; except Result := false; end; end; { Erstellt eine Verbindung zu einem Netzlaufwerk } function NetzlaufwerkVerbinden(ALaufwerk: string; APfad: string; AUsername: string; APassword: string; ARestoreAtLogon: Boolean): DWORD; var NetResource: TNetResource; dwFlags: DWORD; begin with NetResource do begin dwType := RESOURCETYPE_DISK; lpLocalName := PChar(ALaufwerk); lpRemoteName := PChar(APfad); lpProvider := nil; end; if (ARestoreAtLogon) then dwFlags := CONNECT_UPDATE_PROFILE else dwFlags := 0; Result := WNetAddConnection2(NetResource, PChar(APassword), PChar(AUsername), dwFlags); end; Habt ihr eine Idee? |
AW: 2 Netzlaufwerkverbindungen in einem Service
Zitat:
Idee 2: DLL getrennt debuggen, im Debugger Test-Host-Anwendung angeben (Menü Run -> Parameters ... -> Host application). Leider geht aus Deinem Post nicht wirklich hervor, wie die beiden Instanzen (?) derselben (?) DLL nun zugreifen - parallel, nacheinander, aus unterschiedlichen DLLs,woher kommt die Konfiguration... |
AW: 2 Netzlaufwerkverbindungen in einem Service
Zu der Deklaration:
Delphi-Quellcode:
Es hat schon Gründe weshalb das in der Windows API nicht so gemacht wird. Wenn, kannst du das mit WideStrings machen, aber so funktioniert es eher zufällig. Denn Delphi räumt den Speicher am Ende der Methode natürlich wieder auf, so dass du einen Pointer auf einen schon freigegebenen Speicherplatz zurücklieferst. Dass das funktioniert, liegt nur daran, dass der Speicher zufällig noch nicht überschrieben ist, wenn er danach benutzt wird. (Vermutlich weil er an einen String zugewiesen und damit sofort kopiert wird.)
function Run: PChar; stdcall; export;
Zitat:
|
AW: 2 Netzlaufwerkverbindungen in einem Service
Danke für die Antworten!
Die beiden Aufgaben greifen nicht auf den gleichen Speicherbereich zu, da momentan für jeden der beiden eine eigene DLL geladen wird. Also eine Kopie des Originals. Der PChar wird tatsächlich direkt in einen String kopiert. Ich versuche mal das ganze umzuschreiben und per "Prozess verbinden" zu debuggen :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz