type
PPlugInManager = ^TPluginManager;
TPluginManager =
class
public
class function getInstance: TPluginManager;
end;
const InstanceName='
HalloIchMUSSAufDemRechnerGanzEinamligSein';
var InstanceMMF:THandle=0;
implementation
uses windows, sysutils;
class function TPluginManager.getInstance: TPluginManager;
var Instance:PPluginManager;
InstanceExists:boolean;
vInstanceName:
string;
begin
if InstanceMMF=0
then
begin
vInstanceName:=InstanceName+inttohex(getcurrentprocessid,8);
InstanceMMF:=createfilemapping(cardinal(-1),
nil,PAge_ReadWrite,0,4,Pchar(vInstanceName));
InstanceExists:=getlasterror=ERROR_ALREADY_EXISTS;
end
else
InstanceExists:=true;
Instance:=mapviewoffile(InstanceMMF,FILE_MAP_ALL_ACCESS,0,0,0);
try
if InstanceExists
then
result:=Instance^
else
begin
result:=TPluginManager.Create;
Instance^:=result;
end;
finally
unmapviewoffile(Instance);
end;
end;
//irgendwann sollte auch mal closehandle(InstanceMMF) aufgerufen werden. Und das in jeder DLL und Exe.
// vielleicht in einer speziellen Free-Methode (du musst ja auch irgendwann Free bzw. Destroy aufrufen)