AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi In Service-Anwendung dynamisch DLL laden
Thema durchsuchen
Ansicht
Themen-Optionen

In Service-Anwendung dynamisch DLL laden

Ein Thema von gmc616 · begonnen am 27. Feb 2008 · letzter Beitrag vom 28. Feb 2008
Antwort Antwort
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

In Service-Anwendung dynamisch DLL laden

  Alt 27. Feb 2008, 12:23
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.



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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: In Service-Anwendung dynamisch DLL laden

  Alt 27. Feb 2008, 13:44
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!
Andreas
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: In Service-Anwendung dynamisch DLL laden

  Alt 27. Feb 2008, 14:52
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.

  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: In Service-Anwendung dynamisch DLL laden

  Alt 27. Feb 2008, 16:01
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.
Andreas
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: In Service-Anwendung dynamisch DLL laden

  Alt 28. Feb 2008, 02:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: In Service-Anwendung dynamisch DLL laden

  Alt 28. Feb 2008, 05:51
Und wie sieht es ohne Klasse aus ?
Schon mal die nicht dynamische Weise versucht ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz