Zitat von
Evil MM:
Ich habe nun in alle Destroy-Blöcken die es gibt den Wert ComServer.ObjectCount ausgewertet. Tatsächlich steht er in einem Destroy-Block (der letzte der aufgerufen wird) auch auf 0. Jedoch bleibt die OCX wohl noch geladen.
Das ist höchstwahrscheinlich ein gewünschtes Verhalten seitens des Betriebssystems.
Angenommen, in der OCX gibt es eine CoClass und dein Programm erzeugt ein Objekt und zerstört es gleich wieder.
Dann würde jedesmal die OCX geladen und wieder entladen werden. => grosser Performanceverlust
Intelligenter wäre da ein verzögertes Entladen (delayed unload) nach 2 bis 3 Minuten.
Und das wird
IMHO unter Windows auch so gemacht.
Bei Delphi könnte es noch einen anderen Grund geben:
Delphi-Quellcode:
function DllCanUnloadNow: HResult;
begin
if (ComServer = nil) or
((ComServer.FObjectCount = 0) and (ComServer.FFactoryCount = 0)) then
Result := S_OK
else
Result := S_FALSE;
end;
Man sieht, die OCX wird nur entladen wenn sowohl ObjectCount als auch FactoryCount gleich 0 ist.
Da aber FactoryCount normalerweise nicht 0 wird, bleibt die OCX geladen.
Du könntest nun deine eigene Funktion schreiben und exportieren:
Delphi-Quellcode:
library Project1;
uses
ComServ;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
function DllCanUnloadNow: HResult;
begin
if (ComServer = nil) or
((ComServer.FObjectCount = 0) {and (ComServer.FFactoryCount = 0))} then
Result := S_OK
else
Result := S_FALSE;
end;