【问题标题】:How to correctly free/finalize an ActiveX DLL in Delphi?如何在 Delphi 中正确释放/完成 ActiveX DLL?
【发布时间】:2009-11-26 15:44:55
【问题描述】:

我们在这里使用了一个名为 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 注册并忽略泄漏,但这似乎不起作用。此外,即使这只是一种解决方法,我想知道正确的方法。

【问题讨论】:

    标签: delphi memory-leaks activex fastmm


    【解决方案1】:

    别担心。这不是严格意义上的“泄漏”。是的,您正在创建一个永远不会被释放的对象,但关键字是“an”。单数。

    您的应用程序/DLL 不会“泄漏”内存,因为它将创建这些对象的大量实例,并不断增加其内存使用量。此外,当进程终止时,该单个工厂对象(以及其他类似对象)使用的内存将被清理。

    如果您展示了用于调用 RegisterExpectedMemoryLeak() 的代码,则可能可以确定它为什么不适用于您的具体情况。

    【讨论】:

    • 好吧,代码很简单:在初始化中,在分配pAutoObjectFactory之后,调用RegisterExpectedMemoryLeak(pAutoObjectFactory);
    • 关于“别担心”部分:我知道这个泄漏并不重要,但 FastMM 将显示大约 30 个其他泄漏,其中一些是 TAutoObjectFactory 的子级,TODNCServer 的一些部分,因此发现新的内存泄漏将变得更加困难。
    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多