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

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

我的应用程序是使用Delphi 5(旧版应用程序)编写的。我已经安装了Adobe 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返回值4。 !,在我对_Release的第一次跟踪退出后,没有AV。

更新:我没有详尽测试以下内容,但是这种简化的FormClose也可以避免在我的系统上出现AV,无论如何:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Ref : Integer;
begin
  Ref := AcroPdf1.ControlInterface._AddRef;
end;

显然,省略对FormClose的分配不会有任何区别。

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

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

10-15 05:21