GdiplusShutdown (e GdiPlusStartup btw) non può essere chiamato da DllMain ma DllMain è chiamato da Windows e Delphi runtime quando FreeLibrary si chiama: Delphi chiamata la sezione di finalizzazione di tutte le unità utilizzate dalla DLL e la sezione di finalizzazione GDIplus chiama GdiplusShutdown (Questo è perfettamente OK se usato da un eseguibile). Comportamento simile con la sezione di inizializzazione.
Ho risolto il problema aggiungendo un test per IsLibrary nelle sezioni di inizializzazione e di finalizzazione per evitare di chiamare le funzioni offensive, inoltre ho aggiunto due procedure pubbliche InitializeForDll e FinalizeForDll. Con queste piccole modifiche, la DLL è in grado di esportare funzioni chiamando InitializeForDll e FinalizeForDll. Quella funzione esportata deve essere chiamata dall'applicazione di hosting subito dopo aver caricato la DLL e appena prima di scaricare la DLL.
Ecco le modifiche apportate ai GdiPlus.pas:
Nella sezione interfaccia:
var
procedure InitializeForDll;
procedure FinalizeForDll;
Nella sezione implementazione:
procedure InitializeForDll;
begin
Initialize;
end;
procedure FinalizeForDll;
begin
Finalize;
end;
anche aggiornato sezioni di inizializzazione e finalizzazione così:
Initialization
if not IsLibrary then
Initialize;
Finalization
if not IsLibrary then
Finalize;
nella DLL, ho esportato quelle funzioni:
procedure Initialize; stdcall;
begin
GdiPlus.InitializeForDll;
end;
procedure Finalize; stdcall;
begin
GdiPlus.FinalizeForDll;
end;
inizializzare e finalizzare sono chiamati dall'applicazione di hosting a destra dopo la chiamata LoadLibrary e poco prima di chiamare FreeLibrary (o qualunque cosa si caricare/scaricare la DLL).
Spero che questo aiuti gli altri. BTW: Grazie a Eric Bilsen per la fornitura di Delphi GdiPlus Library
Questa è solo una parte della storia. Anche se apporti questa modifica, stai ancora violando le regole chiamando 'GdiplusStartup' dalla sezione di inizializzazione. Probabilmente è necessaria una lettura più approfondita della documentazione. Ho provato a scriverlo nella mia risposta. –
Avevo visto che GdiPlusStartup è stato chiamato ma non ha alcun effetto negativo. Quindi ho solo sistemato ciò che stava fallendo. – fpiette
Non hai ancora riscontrato alcun effetto negativo. La documentazione è molto chiara su questo punto. –