Einzelnen Beitrag anzeigen

Benutzerbild von geskill
geskill

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

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 16:25
Wie ich in den Debugger schaue und auf diesen Satz hoffe: "Modul entladen: ...". Und er kommt, erstmal danke an alle und besonders an oki aber, auch die anderen haben wieder super geholfen. So und an alle die gleiches Vorhaben werde ich hier mal meinen Code präsentieren:

MainForm
Delphi-Quellcode:
type
  TMainForm = class(TForm)
    bDllLaden: TButton;
    bClose: TButton;
    procedure bCloseClick(Sender: TObject);
    procedure bDllLadenClick(Sender: TObject);
  private
    // die Variable muss global gespeichert werden damit FreeLibrary ein Ziel hat
    class var hLib:cardinal;
    const
      wm_FreeMyLibrary = wm_User + 100;
  public
    procedure WMFreeMyLibrary(var Message: TMsg); message WM_FreeMyLibrary;
  end;

  // Die dynamische dekleration einer dll
  TYPE Tcreatedll = PROCEDURE (FormHandle:HWND);

//[...]
procedure TMainForm.bDllLadenClick(Sender: TObject);
VAR Mcreatedll : Tcreatedll;
BEGIN
  hLib := LoadLibrary(PChar('pDLL.dll'));
  IF hLib <> 0 THEN BEGIN
  @Mcreatedll := GetProcAddress(hLib, 'createDll');
  IF @Mcreatedll <> NIL
   // nun wird zusätzlich das handle übergeben, was später benötigt wird
   THEN Mcreatedll(MainForm.Handle);
  END;
end;

procedure TMainForm.WMFreeMyLibrary(var Message: TMsg);
begin
  // hier kann auch alles mögliche stehen, aber dass kann man dann auch in einem callback schreiben
  freelibrary(hLib);
end;
In der DLL.dpr habe ich nichts verändert nur die export Procedure...

DLL Formular
Delphi-Quellcode:
type
  TDllAddons = class(TForm)
    bClose: TButton;
    procedure bCloseClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    const
      wm_FreeMyLibrary = wm_User + 100;
  public
    { Public-Deklarationen }
  end;

//[...]

  AFormHandle:HWND;

  PROCEDURE createDll(FormHandle:HWND);

//[...]

PROCEDURE createDll(FormHandle:HWND);
BEGIN
  IF NOT (Assigned(DllAddons))
    THEN DllAddons := TDllAddons.Create(NIL);

  // parameterübergabe
  AFormHandle := FormHandle;

  DllAddons.Show;
END;

procedure TDllAddons.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TDllAddons.FormDestroy(Sender: TObject);
begin
  // den parameter schön freigeben
  DllAddons := NIL;
  // die nachicht senden
  PostMessage(AFormHandle, wm_FreeMyLibrary, 0, 0);
end;
Und nochmal als Download, damit es auch jeder ausprobieren kann; man bin ich glücklich :dancer: :-D :drunken: :firejump:
Angehängte Dateien
Dateityp: zip postmessage_102.zip (437,9 KB, 2x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat