Как правильно освободить / завершить ActiveX DLL в Delphi? - PullRequest
1 голос
/ 26 ноября 2009

Здесь мы используем класс ODNCServer - при инициализации создается объект TAutoObjectFactory:

initialization
  pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);

Теперь FastMM жалуется на утечку памяти, поскольку этот объект нигде не освобожден. Если я добавлю оператор завершения как этот

finalization
  if assigned(pAutoObjectFactory) then
    TAutoObjectFactory(pAutoObjectFactory).Free;

затем объект освобождается, но после появляется диалоговое окно FastMM об утечке памяти, так что фактически, кажется, ОС выгружает DLL, а не программу. Экземпляры ODNCServer создаются следующим образом

fODNCServer := TODNCServer.Create(nil);
//register into ROT
OleCheck(
 RegisterActiveObject(
   fODNCServer.DefaultInterface,            // instance
   CLASS_ODNCServer,    // class ID
   ACTIVEOBJECT_STRONG,       //strong registration flag
   fODNCServerGlobalHandle //registration handle result
 ));

и освобожден так:

if ((assigned(fODNCServer)) and (fODNCServerGlobalHandle <> -1)) then
begin
  Reserved := nil;
  OleCheck(RevokeActiveObject(fODNCServerGlobalHandle,Reserved));
  fDTRODNCServerGlobalHandle := -1;
end;
FreeAndNil(fODNCServer);

Итак, кто-нибудь знает, что я должен изменить, чтобы избавиться от этой утечки памяти? Кстати, я также пытался использовать FastMM RegisterExpectedMemoryLeaks для регистрации и игнорирования утечки, но это, похоже, не работает. Кроме того, даже если это просто обходной путь, и я хотел бы знать, как это сделать правильно.

1 Ответ

1 голос
/ 26 ноября 2009

Не беспокойся об этом. Это не «утечка» в строгом смысле. Да, вы создаете объект, который никогда не был бы свободным, но ключевое слово "an". Singular.

Ваше приложение / DLL не будет «вытекать» из памяти в том смысле, что оно будет создавать многочисленные экземпляры этих объектов, постоянно увеличивая использование памяти. Кроме того, память, используемая этим единственным фабричным объектом (и другими подобными ему), будет очищена, когда процесс все равно завершится.

Если вы показали код, который используете для вызова RegisterExpectedMemoryLeak () , возможно, можно определить, почему он не работает в вашем конкретном случае.

...