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
 
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, 15: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
 


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 22:20 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