簡體   English   中英

如何在Delphi中正確釋放/完成ActiveX DLL?

[英]How to correctly free/finalize an ActiveX DLL in Delphi?

我們在這里使用一個稱為ODNCServer的類-在初始化時,將創建一個TAutoObjectFactory對象:

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

現在, FastMM抱怨內存泄漏,因為此對象沒有在任何地方釋放。 如果我添加這樣的終結聲明

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

然后釋放該對象,但是彈出有關內存泄漏的FastMM對話框后,實際上,操作系統似乎正在卸載DLL,而不是程序。 ODNCServer實例是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注冊並忽略泄漏,但這似乎不起作用。 此外,即使這只是一種解決方法,我也想知道正確的方法。

不用擔心 從嚴格意義上講,這不是“泄漏”。 是的,您正在創建一個永不釋放的對象,但是關鍵字為“ an”。 單數。

您的應用程序/ DLL不會“泄漏”內存,因為它將創建這些對象的大量實例,並不斷增加其內存使用量。 此外,當進程終止時,該單個工廠對象(以及其他類似對象)使用的內存將被清除。

如果顯示了用於調用RegisterExpectedMemoryLeak()的代碼,則可能可以確定為什么它在您的特定情況下不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM