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: