Es geht auch einiges einfacher, auch wenn dann manuell eine Funktion aufgerufen werden muss. Allerdings entstehen so auch keine "wilden" Abhängigkeiten zur Windows-
API.
Dll:
Delphi-Quellcode:
var
old_mgr: TMemoryManagerEx;
new_mgr: TMemoryManagerEx;
mem_mgt: Boolean = false;
procedure InitMemMgr(mgr: TMemoryManagerEx);
begin
if not mem_mgt then
begin
mem_mgt := true;
GetMemoryManager(old_mgr);
new_mgr := mgr;
SetMemoryManager(new_mgr);
end;
end;
exports
InitMemMgr;
initialization
finalization
if mem_mgt then
SetMemoryManager(old_mgr);
Host:
Delphi-Quellcode:
type
TInitMemMgrProc =
procedure(mgr: TMemoryManagerEx);
var
proc: TInitMemMgrProc;
handle: THandle;
mgr: TMemoryManagerEx;
[...]
handle := LoadLibrary('
foo');
@proc := GetProcAddress(
handle, '
InitMemMgr');
if Assigned(proc)
then
begin
GetMemoryManager(mgr);
proc(mgr);
end;
PS: Ich frage mich ja, warum Borland das mit einer extra
DLL gelöst hat... Gibt es da einen Grund? Die
DLL-Daten und somit die Pointer auf die Memorymanagement-Funktionen werden bei jedem Laden der
DLL doch instanziert und somit an die aufrufende Anwendung angepasst... Gibt es da einen guten Grund?