我的Delphi应用程序有一个使用Acrobat Reader ActiveX控件查看pdf的表单。当我使用控件的函数(LoadFile,gotoNextPage,gotoPreviousPage,gotoFirstPage,gotoLastPage),然后关闭表单时,我收到以下错误:"地址为6AF5703C的访问冲突。阅读地址6AF5703C"。当我运行应用程序但不使用控件的功能,然后关闭表单时,应用程序将退出而不会出错。
有人知道此问题的修复或解决方法吗?
我的应用程序是使用Delphi 5(遗留应用程序)编写的。我安装了Adobe Acrobat Reader DC v15.016.20045。
答案 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;