Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eine DLL freigeben. (CallBack) (https://www.delphipraxis.net/107548-eine-dll-freigeben-callback.html)

geskill 29. Jan 2008 16:59


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?

Muetze1 29. Jan 2008 17:02

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.

geskill 29. Jan 2008 17:08

Re: Eine DLL freigeben.
 
Zitat:

Das Laden sowie freigeben der DLL muss im Hauptprogramm geschehen.
Und WIE?
Die DLL sagt ja wann "Schluss" ist, nicht das Hauptprogramm,
wie kann das Hauptprogramm das mitbekommen,
bzw. wie "sage" ich das dem Hauptprogramm?

Muetze1 29. Jan 2008 17:23

Re: Eine DLL freigeben.
 
Da gibt es mehrere Möglichkeiten, z.B.:

- Windows Message an das Hauptprogramm
- Event triggern
- Callback aufrufen

DeddyH 29. Jan 2008 17:25

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.

geskill 29. Jan 2008 17:35

Re: Eine DLL freigeben.
 
Meinst du mit ShowModal TForm.ShowModal?

Zitat:

Zitat von DeddyH
Wenn die DLL ein Formular anzeigt, muss dies ja mit ShowModal innerhalb der Komponente geschehen.

Wieso müssen? Ich habe ein ganz normales Show.

Delphi-Quellcode:
Addons := TAddons.Create(NIL);
Addons.Show;
Oder sollte man das aus irgendeinem Grund nicht machen, bei mir klappt das wunderbar?

@Muetze1
Das sind doch mal Schlüsselwörter.
Ich werde mich mal durch die Suche wälzen :-)

geskill 29. Jan 2008 20:25

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:
library pDll_CallBack;

uses
  SysUtils,
  Classes,
  uDll_Form in 'uDll_Form.pas' {DllForm};

{$R *.res}

exports
  createdll;

begin
end.
Das DLL Formular
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.

Bernhard Geyer 29. Jan 2008 20:32

Re: Eine DLL freigeben. Mit CallBack
 
Zitat:

Zitat von geskill
Delphi-Quellcode:
procedure TDllForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DllForm.Free;
  DllForm := NIL;

  // Hier muss das Callback starten
  closedll(AhLib);
end;

Autsch. Du gibts ein Objekt im eigene Close-Eventhandler frei. Das wird dir sowas um die Ohren fliegen da du damit Callstack-Technisch dir eine Nirvana baust. Du könntest maximal Action auf caFree setzen und im Destruktor/OnDestroy-Event diene globale Varfiable DLLForm auf nil setzen und anschließend deinem Hauptprogramm z.B. per Windows-Message einen notifier schicken.

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.

geskill 30. Jan 2008 10:08

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

http://www.delphipraxis.net/internal...k+dll+formular

MainForm
Delphi-Quellcode:
  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.
Die DLL.dpr
Delphi-Quellcode:
library pDll;

uses
  SysUtils,
  Classes,
  uDllForm in 'uDllForm.pas' {DllForm};

{$R *.RES}

exports
  CreateDLL;

end.
Und das DLL-Formular
Delphi-Quellcode:
  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.
Muss ich das DLL Formular noch Releasen ? Alse TForm.Release; Oder was mache ich falsch ?

Bernhard Geyer 30. Jan 2008 10:15

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.
Seite 1 von 3  1 23      

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