Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: OCX wird nicht freigegeben

  Alt 30. Okt 2007, 11:33
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;
Andreas
  Mit Zitat antworten Zitat