3

(德尔福 XE2 更新 4)

我正在尝试让我继承的一个大型 Microsoft Word OLE 自动化单元(基于早期绑定的 TWordApplicationWordXP/Word2010单元的接口)WINWORD.EXE在所有引用都已发布时关闭。

到目前为止,看起来我确实发现了几个引用泄漏:大多数引用是属性或局部变量。

然而,一些使用场景仍然保持WINWORD.EXE开放。

一些修复表明我应该更喜欢局部变量而不是链

procedure TOffice_10_XP_WordInterface.AddDocument;
var
  WordApplicationDocuments: Documents;
begin
  WordApplication_Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;

procedure TOffice_10_XP_WordInterface.AddDocument;
var
  WordApplicationDocuments: Documents;
begin
  WordApplicationDocuments := WordApplication_Documents;
  WordApplicationDocuments.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;

基于调用此函数的 WordApplication_Documents 属性:

function TOffice_10_XP_WordInterface.GetWordApplication_Documents: Documents;
begin
  Result := WordApplicationReference.Documents;
  if not Assigned(Result) then
    raise EAccessViolation.Create('Documents');
end;

这些属性使EAccessViolation消息比您在调试器中遇到的 $C0000005 错误更具可读性。

我想知道监视_AddRef_Release调用的通用方法(因为我可能也需要它用于其他自动化项目)。

我确实看过这些链接:

4

1 回答 1

1

让您前进的乏味方式是:

在 Delphi单元中放置不在特定方法内的所有_AddRef和调用的断点。_ReleaseSystemTInterfacedObject

现在消除(使用条件表达式)不属于 Delphi 的所有接口(EAX包含vTable每个接口的指针)。

  1. 通过简单的运行/退出开始调试您的应用程序,而无需执行太多实际功能:
  2. 在每次调用中进行跟踪之前,请记下该EAX值。
  3. 如果您最终采用以下任何一种方法:NopRelease, NopAddref, TInterfacedObject._AddRef, TInterfacedObject._Release, MemReleaseMemAddRef则将该EAX值添加到所有断点的条件断点指令中,如下所示。

我的应用程序的示例条件断点表达式:

(EAX <> $401E58) and (EAX <> $54AD14) and (EAX <> $4A7C88) ...

这种方法有很多缺点,但它可以让你继续前进。

缺点:

  • 条件断点表达式的长度有限制。这意味着如果您继续添加and (EXA <> $xxxx)部分,调试器将忽略这些部分而不显示警告。
  • 如果您在不保存桌面的情况下退出 Delphi,则会丢失设置
  • 设置需要很多时间
于 2013-05-27T10:21:49.007 回答