AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eine DLL freigeben. (CallBack)

Ein Thema von geskill · begonnen am 29. Jan 2008 · letzter Beitrag vom 30. Jan 2008
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#1

Eine DLL freigeben. (CallBack)

  Alt 29. Jan 2008, 17:59
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?
Sebastian
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Eine DLL freigeben.

  Alt 29. Jan 2008, 18:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Eine DLL freigeben.

  Alt 29. Jan 2008, 18:08
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?
Sebastian
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Eine DLL freigeben.

  Alt 29. Jan 2008, 18:23
Da gibt es mehrere Möglichkeiten, z.B.:

- Windows Message an das Hauptprogramm
- Event triggern
- Callback aufrufen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: Eine DLL freigeben.

  Alt 29. Jan 2008, 18:25
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Eine DLL freigeben.

  Alt 29. Jan 2008, 18:35
Meinst du mit ShowModal TForm.ShowModal?

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 :-)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Eine DLL freigeben. Mit CallBack

  Alt 29. Jan 2008, 21:25
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.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Eine DLL freigeben. Mit CallBack

  Alt 29. Jan 2008, 21:32
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:08
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 ?
Angehängte Dateien
Dateityp: zip dlldynamisch_520.zip (331,2 KB, 0x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 11:15
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:16 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