Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

Re: ShareMem ohne ShareMem.dll und Co.

  Alt 13. Sep 2009, 23:36
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?
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat