Нарушение доступа 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;