Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In Service-Anwendung dynamisch DLL laden (https://www.delphipraxis.net/109272-service-anwendung-dynamisch-dll-laden.html)

gmc616 27. Feb 2008 11:23


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:
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;
Nutze ich diese Klasse um meine Dll zu laden in einer normalen Win32-Anwendung, funktioniert es wunderbar.
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

shmia 27. Feb 2008 12:44

Re: In Service-Anwendung dynamisch DLL laden
 
Zitat:

Zitat von gmc616
Delphi-Quellcode:
 FDllHandle := loadLibrary(pchar(ADllFilePath));

 // if FDllHandle <> 0 then // Nö
 if FDllHandle <> INVALID_HANDLE_VALUE then
 begin
    FInit := GetProcAddress(FDllHandle,'fInit'); // <-- hier knallts in DLL laut Debugger
 end

Ach ja, nochwas: ActiveX DLLs werden nicht über LoadLibrary geladen!

gmc616 27. Feb 2008 13:52

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: DLLProc richtig "erweitern"
Kann es daran liegen?

Wie schon gesagt: Die DLL und die Klasse funktionieren in einer Win32-Anwendung problemlos.

:pale:

shmia 27. Feb 2008 15:01

Re: In Service-Anwendung dynamisch DLL laden
 
Zitat:

Zitat von gmc616
Ich habe die DllProc in meiner Dll überschrieben nach diese Art: DLLProc richtig "erweitern"
Kann es daran liegen?

Das würde ich auf jeden Fall mal testweise auskommentieren.

gmc616 28. Feb 2008 01:19

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. :(

turboPASCAL 28. Feb 2008 04:51

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