![]() |
Eine DLL freigeben. (CallBack)
Nabend,
Ich habe ein Programm was eine DLL aufruft, dynamisch. Wenn ich die DLL aufrufe, dann lade ich ein Formular. Wenn ich aber das Formular wieder schließe, würde ich die DLL gerne wieder entladen. Nur jetzt stellt sich die Frage WIE? Ich habe bereits versucht mit dem OnClose Ereignis die DLL freizugeben "FreeLibrary();". Den Parameter dazu sende ich beim laden der DLL. Jedoch wird durch diesen Aufruf das ganze Programm geschlossen. Deshalb vermute ich das der Aufruf von FreeLibrary vom Hauptprogramm stammen muss, oder? |
Re: Eine DLL freigeben.
Die DLL kann sich schlecht selbst freigeben, während sie noch Code in sich selber ausführt. Wie sollte denn die nächste Anweisung nach dem FreeLibary() ausgeführt werden, wenn die DLL freigegeben ist?
Das Laden sowie freigeben der DLL muss im Hauptprogramm geschehen. |
Re: Eine DLL freigeben.
Zitat:
Die DLL sagt ja wann "Schluss" ist, nicht das Hauptprogramm, wie kann das Hauptprogramm das mitbekommen, bzw. wie "sage" ich das dem Hauptprogramm? |
Re: Eine DLL freigeben.
Da gibt es mehrere Möglichkeiten, z.B.:
- Windows Message an das Hauptprogramm - Event triggern - Callback aufrufen |
Re: Eine DLL freigeben.
Wenn die DLL ein Formular anzeigt, muss dies ja mit ShowModal innerhalb der Komponente geschehen. Daher tippe ich, wenn Du aus der "Aufruffunktion" der Host-Anwendung herauskommst, sollte FreeLibrary eigentlich funktionieren. Falls ich hier falsch liege, möge man mich korrigieren.
|
Re: Eine DLL freigeben.
Meinst du mit ShowModal TForm.ShowModal?
Zitat:
Delphi-Quellcode:
Oder sollte man das aus irgendeinem Grund nicht machen, bei mir klappt das wunderbar?
Addons := TAddons.Create(NIL);
Addons.Show; @Muetze1 Das sind doch mal Schlüsselwörter. Ich werde mich mal durch die Suche wälzen :-) |
Re: Eine DLL freigeben. Mit CallBack
Irgendwie stehe ich komplett auf dem Schlauch :wall: ich komm einfach nicht mehr weiter ....
Wäre echt nett, wenn ihr mal drüberschaut. Ich habe mir ein Beispiel angeschaut (CallBack), dass konnte mir jedoch auch nicht weiterhelfen :-((( Hauptunit
Delphi-Quellcode:
TYPE TCallBackFunction = FUNCTION (hLib:Cardinal) : Cardinal;
PROCEDURE FreeDLL(hLib:Cardinal); TYPE Tcreatedll = PROCEDURE (hLib:Cardinal); var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.bLoadDllClick(Sender: TObject); VAR hLib:cardinal; Mcreatedll : Tcreatedll; BEGIN hLib := LoadLibrary(PChar('pDll_CallBack.dll')); IF hLib <> 0 THEN BEGIN @Mcreatedll := GetProcAddress(hLib, 'createdll'); IF @Mcreatedll <> NIL // Hier muss noch was passieren! THEN Mcreatedll(hLib); END; end; PROCEDURE FreeDLL(hLib:Cardinal); BEGIN FreeLibrary(hLib); END; Die DLL.dpr
Delphi-Quellcode:
Das DLL Formular
library pDll_CallBack;
uses SysUtils, Classes, uDll_Form in 'uDll_Form.pas' {DllForm}; {$R *.res} exports createdll; begin end.
Delphi-Quellcode:
// Die Prozedur für den Export PROCEDURE createdll(hLib:Cardinal); // in dieser Variable halte ich den Parameter der DLL VAR AhLib : Cardinal; TYPE TCallBackFunction = FUNCTION (hLib:Cardinal) : Cardinal; var DllForm: TDllForm; implementation {$R *.dfm} PROCEDURE closedll(hLib:Cardinal); BEGIN // ??? END; PROCEDURE createdll(hLib:Cardinal); BEGIN IF NOT (Assigned(DllForm)) THEN DllForm := TDllForm.Create(NIL); // Parameter zur speicherung übergeben AhLib := hLib; DllForm.Show; END; procedure TDllForm.bCloseClick(Sender: TObject); begin close; end; procedure TDllForm.FormClose(Sender: TObject; var Action: TCloseAction); begin DllForm.Free; DllForm := NIL; // Hier muss das Callback starten closedll(AhLib); end; end. |
Re: Eine DLL freigeben. Mit CallBack
Zitat:
Und bei nicht Modalen Formularen wird die Freigabe mit Release durchgeführt und nicht mit einem Free, da sonst einige Windows-Messages ebenfalls im Nirvana landen. |
Re: Eine DLL freigeben. (CallBack)
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, ich habe im Forum was gefunden was ich auch einigermaßen verstanden habe, leider haut mir ein AV alles um die Ohren :-(((
![]() MainForm
Delphi-Quellcode:
Die DLL.dpr
TYPE Tcreatedll = PROCEDURE (ACallBack: Pointer);
PROCEDURE FreeDLL; var Form1: TForm1; hLib:cardinal; implementation {$R *.DFM} PROCEDURE FreeDLL; BEGIN // zum Test ob das CallBack klappt ShowMessage('Hallo'); // Un hier knallt es! Dabei wird auch das Hauptformular geschlossen, wenn der Debugger // deaktiviert ist. FreeLibrary(hLib); END; procedure TForm1.bLoadDllClick(Sender: TObject); VAR Mcreatedll : Tcreatedll; BEGIN hLib := LoadLibrary(PChar('pDll.dll')); IF hLib <> 0 THEN BEGIN @Mcreatedll := GetProcAddress(hLib, 'CreateDLL'); IF @Mcreatedll <> NIL // Hier wird die Prozedur übergeben die ausgeführt werden soll. THEN Mcreatedll(@FreeDLL); END; end; end.
Delphi-Quellcode:
Und das DLL-Formular
library pDll;
uses SysUtils, Classes, uDllForm in 'uDllForm.pas' {DllForm}; {$R *.RES} exports CreateDLL; end.
Delphi-Quellcode:
Muss ich das DLL Formular noch Releasen ? Alse TForm.Release; Oder was mache ich falsch ?
PROCEDURE CreateDLL(ACallBack: Pointer);
var DllForm: TDllForm; var gCallBack: procedure = nil; implementation {$R *.DFM} PROCEDURE CreateDLL(ACallBack: Pointer); BEGIN IF NOT Assigned(DllForm) THEN DllForm := TDllForm.Create(NIL); DllForm.Show; // Parameter übergeben... @gCallBack := ACallBack; END; procedure TDllForm.FormDestroy(Sender: TObject); begin DllForm := NIL; // CallBack starten if Assigned(gCallBack) then gCallBack; end; procedure TDllForm.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; procedure TDllForm.bCloseClick(Sender: TObject); begin close; end; end. |
Re: Eine DLL freigeben. (CallBack)
Du zerschießt dir schon wieder deinen Aufrufstack.
Du darfst keinen "Programmfaden" (Stack) mehr haben der sich auf Speicher in der DLL bezieht wenn du die DLL freigibst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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