gpt4 book ai didi

delphi - 表单关闭时 Acrobat Reader ActiveX 访问冲突

转载 作者:行者123 更新时间:2023-12-03 14:56:37 25 4
gpt4 key购买 nike

我的 Delphi 应用程序有一个使用 Acrobat Reader ActiveX 控件查看 pdf 的表单。当我使用控件的函数(LoadFile、gotoNextPage、gotoPreviousPage、gotoFirstPage、gotoLastPage),然后关闭窗体时,出现以下错误:“地址 6AF5703C 处发生访问冲突。读取地址 6AF5703C”。当我运行应用程序,但不使用控件的功能,然后关闭窗体时,应用程序将退出而不会出现错误。

有人知道此问题的修复或解决方法吗?

我的应用程序是使用 Delphi 5(旧版应用程序)编写的。我安装了 Adob​​e Acrobat Reader DC v15.016.20045。

最佳答案

正如我在对 Zam 的评论中所说,今天下载的 Acrobat Reader DC 的当前版本,我遇到了与您完全相同的错误。

请尝试此代码,并让我们知道它是否可以为您避免错误,因为它确实适合我,并且在 FormClose 中或之后都没有 AV。

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Ref : Integer;
begin
Ref := AcroPdf1.ControlInterface._AddRef;
AcroPdf1.Src := '';
AcroPdf1.Free;
AcroPdf1 := Nil;
end;

这是我的 FormCreate,其中包含我唯一的其他代码。

procedure TForm1.FormCreate(Sender: TObject);
begin
AFileName := 'd:\aaad7\pdf\printed.pdf';
AcroPdf1.src := AFileName;
AcroPdf1.setZoom(200); // <- this line is to exercise the
// ControlInterface to provoke the AV on shutdown
end;

我完全不知道为什么我的 FormClose 避免了 AV 问题,在其他人这么说之前,是的,它对我来说也很疯狂!几乎不是什么值得“解决方案”这个名字的东西,但也许它会为比我更了解 COM 和 Ole 控件的人建议一个正确的解决方案。

我最初包含 Ref := AcroPdf1._AddRef 只是作为实验。我注意到,在它之后,Ref的值为9。在AcroPdf1.Src := ''之后,在调试器中调用AcroPdf1._Release evaluator 返回的值是 4。我本来想看看是否可以通过重复调用 _Release 来强制 RefCount 下降来避免 AV,但是很快!,在我第一次跟踪 后就没有 AV 了。 FormClose 已退出。

更新:我还没有彻底测试以下内容,但这个简化的 FormClose 无论如何也可以避免在我的系统上出现 AV:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Ref : Integer;
begin
Ref := AcroPdf1.ControlInterface._AddRef;
end;

显然,省略对 Ref 的赋值不会产生任何影响。

顺便说一句,我正在 64 位 Win10 上使用 Delphi 10 Seattle。

关于delphi - 表单关闭时 Acrobat Reader ActiveX 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885850/

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