gpt4 book ai didi

delphi - 如何跟踪 OLE 自动化对象的 _AddRef/_Release 调用

转载 作者:行者123 更新时间:2023-12-03 15:58:14 26 4
gpt4 key购买 nike

(德尔福 XE2 更新 4)

我正在尝试获取一个继承的大型 Microsoft Word OLE 自动化单元(基于早期绑定(bind) TWordApplication 和来自 WordXP/Word2010 单元的接口(interface))释放所有引用后关闭 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来电。

我确实查看了这些链接:

最佳答案

让你继续前进的一个乏味的方法是:

对所有 _AddRef 放置断点和_Release在Delphi中调用System不在内部的单元 TInterfacedObject具体方法。

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

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

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

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

这种方法有很多缺点,但它能让你继续下去。

缺点:

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

关于delphi - 如何跟踪 OLE 自动化对象的 _AddRef/_Release 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16749191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com