如何在Delphi中正确释放/完成ActiveX DLL?

时间:2009-11-26 15:44:56

标签: delphi memory-leaks activex fastmm

我们在这里使用一个名为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 个答案:

答案 0 :(得分:1)

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

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

如果您展示了用于调用 RegisterExpectedMemoryLeak() 的代码,则可能会确定它无法解决您的具体案例的原因。