2016-06-17 58 views
6

Benim Delphi uygulamasında, pdfs'yi görüntülemek için Acrobat Reader ActiveX denetimini kullanan bir form var. Denetimin işlevlerini (LoadFile, gotoNextPage, gotoPreviousPage, gotoFirstPage, gotoLastPage) kullandığımda, formu kapatın, aşağıdaki hatayı alıyorum: "Erişim 6AF5703C adresindeki ihlali. Adres 6AF5703C". Uygulamayı çalıştırdığımda, ancak denetimin işlevlerini kullanmayın ve formu kapatın, uygulama hatasız olarak çıkacaktır.Acrobat Reader ActiveX Access Form üzerinde ihlali kapat kapat

Bu sorunla ilgili bir düzeltme veya geçici çözüm bilen var mı?

Uygulamam Delphi 5 (eski uygulama) kullanılarak yazılmıştır. Adobe Acrobat Reader DC v15.016.20045 yüklü.

+1

TPDF nesnesini (PDFLib_Tlb.Pas dosyasını içe aktarma) kullandım ve Win10 altında çalışmaya başladığımdan beri, ancak formunuzu kapatmadan önce TPDF örneğinin FIntf üyesini Nil'e ayarlamayı denediniz mi? İlk denemem olurdu. Btw "F" öneki rağmen, FIntf bir kamu üyesidir. Delphi (DX10 dahil) modern versiyonu ile benzer – MartynA

+1

. Çözümü bulmaya çalışırken saatlerimi harcadım, ama başarılı olamadım. AdobeTlb dosyasını yeniden oluşturmak ve değiştirmek işe yaramadı. Ben şimdiye kadar @MartynA çözüm denemedim :) bugüne kadar benim blok DC – Zam

+0

@Zam denemede, Adobe kontrol denemek için kod, ben Okuyucu DC mevcut sürümü yüklü ve aynı sorun, şimdiye kadar w/o çözüm alıyorum. Active X'in artık bir Public FIntf üyesi yok, bu yüzden öneri ile uğraşma. – MartynA

cevap

8

Zam'a yapılan bir yorumda söylediğim gibi, bugünkü Acrobat Reader DC'nin bugünkü sürümü indirildiyse, sizle aynı hatayı alıyorum.

Lütfen bu kodu deneyin ve hatadan kaçınmanızı isteyip istemediğinizi bize bildirin; çünkü kesinlikle benim için çalışıyor ve FormClose ya da sonrasında AV yok.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
var 
    Ref : Integer; 
begin 
    Ref := AcroPdf1.ControlInterface._AddRef; 
    AcroPdf1.Src := ''; 
    AcroPdf1.Free; 
    AcroPdf1 := Nil; 
end; 

Bu, diğer tek kodumu içeren FormCreate'tir.

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; 

benim FormClose AV sorunu engeller niçin hiçbir fikrim yok ve herkesten öyle diyor önce, evet, o da bana deli görünüyor! “Çözüm” adını hak eden bir şey değil ama belki de COM ve Ole kontrolleri hakkında benden daha fazlasını bilen birine uygun bir çözüm önereceğim.

Orijinal olarak Ref := AcroPdf1._AddRef'u bir deneme olarak ekledim. Bunu fark ettikten sonra, Ref'un değeri 9'du. AcroPdf1.Src := '''dan sonra hata ayıklayıcı değerlendiricisinde AcroPdf1._Release'u arayarak 4 değerini döndürdüm. Tekrar tekrar _Release numaralı telefonu arayarak ancak ardından Presto'yu çağırarak AV'nin önlenip sakınmadığını görmek üzereydim. !, FormClose'a ilk izlememden sonra AV çıkmadı.

Güncelleme

: Ref için atama atlayarak yapmamalı,

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
var 
    Ref : Integer; 
begin 
    Ref := AcroPdf1.ControlInterface._AddRef; 
end; 

Açıkçası: Ben etraflıca aşağıdaki fakat bu basitleştirilmiş FormClose da herhangi bir oranda sistemimde, AV önler test etmedim herhangi bir fark.

64-bit Win10, btw'de Delphi 10 Seattle kullanıyorum.

+0

Bu, TAcroPdf örnekleriyle bir bellek sızıntısına neden olur mu? Belki, nesne referansını serbest bırakırken arayüzün artan referans sayısı (_AddRef) göz ardı edilir. Nesne başvurusunu iptal etmeden önce _Release çağrısı yapmayın. Ne zaman ben tekrar erişim ihlali var. – mcdon

+0

Bu, Delphi 6 eski uygulamasında mükemmel çalışır. Benim durumumda, uygulama başlangıcında oluşturulan ve kapatma sırasında yok edilen tek bir TAcroPDF nesnesi var. – pacpinto

+0

Güzel, +1. '_AddRef()' çağrısı, ana sürecin sonlanmasına kadar (ve bellek ve bazı CPU döngüleri tüketen) Acrobat Reader işleminin maliyetine erişim ihlalini giderir. Ardından işletim sistemi her şeyi temizler. – mghie