Нарушение доступа ActiveX Acrobat Reader при закрытии формы
мое приложение Delphi имеет форму, которая использует элемент управления ActiveX Acrobat Reader для просмотра PDF-файлов. Когда я использую функции элемента управления (LoadFile, gotoNextPage, gotoPreviousPage, gotoFirstPage, gotoLastPage), затем закрываю форму, я получаю следующую ошибку: "нарушение доступа по адресу 6AF5703C. Прочитайте адрес 6AF5703C". Когда я запускаю приложение, но не использую функции элемента управления, а затем закрываю форму, приложение выйдет без ошибок.
кто-нибудь знает исправить или обойти эту проблему?
мое приложение написано с помощью Delphi 5 (устаревшее приложение). У меня есть Adobe Acrobat Reader DC v15.016.Установлено 20045.
2 ответов
как я сказал в комментарии к Zam, с текущей версией, загруженной сегодня Acrobat Reader DC, я получаю ту же ошибку, что и вы.
пожалуйста, попробуйте этот код и сообщите нам, избегает ли он ошибки для вас, потому что он, безусловно, работает для меня, и нет AV, либо в FormClose
или после.
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. Я собирался посмотреть, удалось ли избежать AV, заставив обратный отсчет вниз, неоднократно вызывая _Release
а потом вуаля!, не было AV после моего первого следа в FormClose
выход.
обновление: я не проверил следующее исчерпывающе, но это упростило FormClose
также избегает AV, по крайней мере, в моей системе:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Ref : Integer;
begin
Ref := AcroPdf1.ControlInterface._AddRef;
end;
очевидно, опуская задание Ref
не имеет никакого значения.
я использую Delphi 10 Seattle на 64-битном Win10, кстати.
лучшим решением является редактирование объекта TPDF в " AcroPDFLib_Tlb.pas"
просто добавьте правильный деструктор в код, чтобы освободить объект OLE:
декларация
Type
TAcroPDF = class(TOleControl)
...
public
destructor Destroy; override; // <- New Line
...
end;
реализация
destructor TAcroPDF.Destroy;
begin
FIntf := NIL;
inherited;
end;