表单关闭

时间:2016-06-17 16:00:58

标签: delphi activex acrobat

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

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

我的应用程序是使用Delphi 5(遗留应用程序)编写的。我安装了Adobe Acrobat Reader DC v15.016.20045。

2 个答案:

答案 0 :(得分:11)

正如我在给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问题,之前别人这么说,是的,它看起来疯狂的给我,太!几乎没有什么值得这个名字&#34;解决方案&#34;,但也许它会建议一个适当的解决方案给那些比我更了解COM和Ole控制的人。

我最初将Ref := AcroPdf1._AddRef作为实验包含在内。我注意到它之后,Ref的值为9.在AcroPdf1.Src := ''之后,在调试器评估程序中调用AcroPdf1._Release返回值4.我正要看看是否通过反复调用_Release但是然后Presto!强制降低RefCount来避免AV,在我第一次跟踪FormClose退出后没有AV。

更新:我没有详尽地测试以下内容,但这个简化的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,顺便说一句。

答案 1 :(得分:1)

更好的解决方案是在“AcroPDFLib_Tlb.pas”中编辑TPDF对象

只需在代码中添加适当的析构函数即可释放OLE对象:

<强>声明

Type
  TAcroPDF = class(TOleControl)
  ...
  public
    destructor Destroy; override; // <- New Line
  ...
  end;

<强>实施

destructor TAcroPDF.Destroy;
begin
 FIntf := NIL;
 inherited;
end;