![]() |
In Service-Anwendung dynamisch DLL laden
Hallo DP,
irgendwie stehe ich auf dem Schlauch. Ich versuche eine Service-Anwendung zu schreiben, die dynamisch eine DLL lädt. Frage 1: Das sollte doch funktionieren, oder? hierfür habe ich mir eine Klasse gebastelt:
Delphi-Quellcode:
Nutze ich diese Klasse um meine Dll zu laden in einer normalen Win32-Anwendung, funktioniert es wunderbar.
type
TFN_fInit = function (ADocID : integer) : boolean; Stdcall; TDynDll = Class (TObject) private FDllHandle : Integer; Finit : TFN_fInit; public Constructor Create (ADllFilePath : string); end; [...] constructor TDynDll.Create(ADllFilePath: string); var bErr : boolean; begin bErr := false; if FileExists (ADllFilePath) then begin FDllHandle := loadLibrary(pchar(ADllFilePath)); if FDllHandle <> 0 then begin FInit := GetProcAddress(FDllHandle,'fInit'); // <-- hier knallts in DLL laut Debugger end else bErr := true; end else bErr := true; // <-- Hier laut EurekaLog end; Benutze ich diese Klasse in meiner Service-Anwendung, knallts es mit einer AV auf der Zeile FInit := GetProcAddress(FDllHandle,'fInit'); laut Debugger. Eurekalog gibt mir allerdings die letze Codezeile vom TDynDll.Create als Fehlerstelle an. Das finde ich eigenartig. :gruebel: Frage 2: Gibts es irgend etwas zu beachten beim dynamischen laden von DLLs in Service-Anwendungen? Ich nutze die für die Service-Anwendung die TService-Klasse aus SvcMgr.pas, die mir die Delphi7-IDE anbietet. Das ganze soll als Interaktiver Dienst laufen im Lokalen Systemaccount. In der DLL wird ein ActiveX geladen, aber erst wenn ich es rufe. Hab ich was übersehen oder vergessen oder überlesen? Grüße gmc |
Re: In Service-Anwendung dynamisch DLL laden
Zitat:
|
Re: In Service-Anwendung dynamisch DLL laden
Das FDllHandle ist valid, denn auch das Überprüfen mit if FDllHandle <> INVALID_HANDLE_VALUE then ergibt TRUE.
Wenn ich im Code eine weitere Funktion aus der DLL verknüpfe, ist der Zeiger auf FInit <> NIL. Also scheint das Besorgen der Einsprungadresse geklappt zu haben. Irgendwie habe ich den Eindruck, dass beim Verlassen der Create-Prozedure der Fehler auftritt, denn so lang ich innerhalb der Procedure den Code mit dem Debugger verfolge, funktioniert alles einwandfrei. Erst beim Verlassen der Create-Procedure kommt die AV und der Debugger zeigt auf eine Stelle im Code, an dem er schon vorbei war und EurokaLog zeigt auf eine Stelle im Code, wo "er" hätte gar nicht vorbei kommen können/müssen. Ach ja: Meine Dll ist KEINE ActiveX-Dll, sondern es wird in der Dll "nur bei Bedarf" eine ActiveX-Komponente gerufen und initialisiert. Was mir grad noch einfällt: Ich habe die DllProc in meiner Dll überschrieben nach diese Art: ![]() Kann es daran liegen? Wie schon gesagt: Die DLL und die Klasse funktionieren in einer Win32-Anwendung problemlos. :pale: |
Re: In Service-Anwendung dynamisch DLL laden
Zitat:
|
Re: In Service-Anwendung dynamisch DLL laden
Hab ich probiert. Macht keinen Unterschied.
Auch mit eine "nackten" Dll mit nur einer simplen "Addieren"-Funktion schmiert mein Service an den genannten Stellen ab. Ich weiß nicht weiter. :( |
Re: In Service-Anwendung dynamisch DLL laden
Und wie sieht es ohne Klasse aus ?
Schon mal die nicht dynamische Weise versucht ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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