Wahrscheinlich liegt das an der globalen Variable dass deren RefCount erst ziemlich spät auf Null fällt und zu dem Zeitpunkt hat die Host-Anwendung in ihrem Shutdown wahrscheinlich schon so komische Dinge gedreht dass man keine Threads mehr fortsetzen kann.
Globale Interface-Variablen sind m.E. ein No-Go. Mal unabhängig davon, daß globale Variablen an sich schon bedenklich sind.
Daran habe ich gar nicht gedacht!
Meine Vermutung war, dass ich irgendetwas mit dem Event verkehrt gemacht habe.
Wenn ich die Factory-Funktion so umändere, dass die einzig lebende Instanz dann nur im Hauptformular existiert, dann geht es!
Vielen Dank!
Delphi-Quellcode:
implementation
//var
// _DataManager : IDataManager;
function GetDataManager(out DataManager : IDataManager) : ByteBool; stdcall;
begin
// if not Assigned(_DataManager) then
// begin
// _DataManager := TDataManager.Create;
// end;
// DataManager := _DataManager;
DataManager := TDataManager.Create;
Result := Assigned(DataManager);
end;
Ich hatte mir das ein bisschen von
VCL.Direct2D abgeschaut.
Das scheint aber ein bisschen anderes zu funktionieren, verstehe den Trick mit dem InterlockedCompareExchangePointer noch nicht so ganz.
Delphi-Quellcode:
unit Vcl.Direct2D;
...
implementation
...
{ Singleton objects }
var
SingletonD2DFactory: ID2D1Factory;
function D2DFactory(factoryType: TD2D1FactoryType=D2D1_FACTORY_TYPE_SINGLE_THREADED;
factoryOptions: PD2D1FactoryOptions=nil): ID2D1Factory;
var
LD2DFactory: ID2D1Factory;
begin
if SingletonD2DFactory =
nil then
begin
D2D1CreateFactory(factoryType, IID_ID2D1Factory, factoryOptions, LD2DFactory);
if InterlockedCompareExchangePointer(Pointer(SingletonD2DFactory), Pointer(LD2DFactory),
nil) =
nil then
LD2DFactory._AddRef;
end;
Result := SingletonD2DFactory;
end;