Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dll-Ausführen von Code bevor sie aus dem Speicher geladen wi (https://www.delphipraxis.net/30675-dll-ausfuehren-von-code-bevor-sie-aus-dem-speicher-geladen-wi.html)

Jörn 27. Sep 2004 21:41


Dll-Ausführen von Code bevor sie aus dem Speicher geladen wi
 
Wie der Titel schon sagt, kann ich, bevor die dll aus dem Speicher geladen oder von mir aus 'beendet' wird, noch Code ausführen, um zB wichtige Daten zu speichern? Problem ist, es geht um eine ISAPI-dll, ich kann also nicht vor dem Beenden des Host-Programmes noch eine Prozedur in der dll ausführen lassen.

supermuckl 27. Sep 2004 21:46

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
auch net mit dem onclose ereignis der hostanwendung ?
weil da müsste ja das OS drauf warten bis der code abgelaufen ist und da kannste ja der dll noch schnell "in den hintern treten"

fiasko 27. Sep 2004 22:16

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
Dafür gibt es imho den finalization Abschnitt - ich denke mal der funzt auch in DLL's.

Jörn 27. Sep 2004 22:20

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
Zitat:

Zitat von supermuckl
auch net mit dem onclose ereignis der hostanwendung ?
weil da müsste ja das OS drauf warten bis der code abgelaufen ist und da kannste ja der dll noch schnell "in den hintern treten"

Ja das ist ja das Problem - die Hostanwendung ist ein Webserver, wie bei mir zB Sambar, und die hab ich ja nun nicht geschrieben. Aber das mit finalization werd ich gleich mal testen.

EDIT: Laut Hilfe ist das sogar speziell für dlls - sollte also klappen. Vielen Dank!

Nochmal EDIT: Ist doch nicht für dlls, aber ich habe dadurch in der Hilfe anderen Code gefunden:

Delphi-Quellcode:
library Test;
var

  SaveExit: Pointer;

procedure LibExit;

begin
  ... // library exit code
  ExitProc := SaveExit; // restore exit procedure chain
end;

begin

  ... // library initialization code
  SaveExit := ExitProc; // save exit procedure chain
  ExitProc := @LibExit; // install LibExit exit procedure
end.

c113plpbr 28. Sep 2004 13:48

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
Soweit ich weis, is dies die "Einzig Wahre" Methode:
Delphi-Quellcode:
procedure EntryProc(dwReason: DWORD);
begin
  if (dwReason = DLL_PROCESS_DETACH) then
  begin

  end;
end;

begin
  DLLProc := @EntryProc;
end.
Deine Methode mag zwar funktionieren, aber diese hier ist dafür prädestiniert *g*
siehe Delphi-Referenz durchsuchenDLLProc

ciao, Philipp

Golze 29. Sep 2004 20:03

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
Hi zusammen,
Philipp hat recht. Deshalb hier noch mal von mir ein kleines komplettes Beispiel

Delphi-Quellcode:
library TestDLL;
uses
  Windows, SysUtils, Classes, Forms;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: InitializeMethode; //die methode muss ich selber schreiben
    DLL_PROCESS_DETACH: FinalizeMethode; //die methode muss ich selber schreiben
  end;
end;

begin
  {First, assign the procedure to the DLLProc variable.}
  DllProc := @DLLEntryPoint;

  {Now invoke the procedure to reflect that the DLL is attaching to the process.}
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Der Finalize-Abschnitt innerhalb einer Unit funktioniert nicht. Dieser Abschnitt gilt generell nur für eine Unit und nicht für eine DLL. Wie und Wann eine Unit geladen oder entladen wird, ist von Delphi abhängig. Vor dem Laden von Units macht Delphi einiges im Hintergrund, was mit der DLL oder auch der Programmdatei selbst nicht viel zu tun hat.

Jörn 29. Sep 2004 20:10

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
Das mit dem finalization-Abschnitt hatte ich ja schon angehangen. Aber ich denke, ich werde meine gepostete Methode verwenden, die gefällt mir da irgendwie besser. Oder spricht was dagegen?

Golze 30. Sep 2004 09:42

Re: Dll-Ausführen von Code bevor sie aus dem Speicher gelade
 
... nööö, nur zu. Sie müßte ebenso funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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