2010-11-19 17 views
1

Bir iletişim kutusu oluşturan bir VB6 ActiveX DLL yöntemini çağıran bir .NET 3.5 winforms uygulamasına sahibim. Her şey neredeyse 10 yıl boyunca iyi çalıştı (ilk önce .NET 1.1 uygulaması, sonra 2.0, sonra 3.5, Windows XP'de). Şimdi müşteri Windows 7'ye yükseltti erdiğinden, aramanın bir System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt..NET/VB6 Uygulaması, Windows 7'de başarısız oluyor

yapıyı yaşıyorum şu şekildedir: VB6Object sınıfında

NET Kod

try { 
    VB6Object obj = new VB6Object(); 
    obj.DoStuff(); 
} 
catch (Exception ex) { // handle } 

VB6 kodu

Public Sub DoStuff() 
    on error goto errHandle 
    RetrieveData(); 

    Call frmPopup.Show(vbModal) 

exitPoint: 
    exit sub 
errHandle: 
    ' handle error 
End Sub 

sorun VB6 kodunda başlar bu satırda: Call frmPopup.Show(vbModal). Hata, .NET koduna iletilir (VB6 kodundaki hata işleyicileri tamamen yok sayılır) ve hatayı işlemek. Sorunun frmPopup'un Load olayı olabileceğini düşündüm, ancak kod Load olayına hiç ulaşmadı (bende her yerde izleme ifadeleri var, dolayısıyla böyle biliyorum).

İlgi çekici kısmı, ikinci kez çağrı yaptığım, hiç başarısız olmadığının, ancak formun 3. parti bir ızgarayı (ActiveX DevExpress Quantum Grid) eksik olmasıdır, bu yüzden, ızgaranın muhtemelen muhtemelen Windows 7 ile bir şekilde uyumludur.

Açıkladığım her şey, uygulamayı bir EXE veya VS2008 IDE'den çalıştırdığımda gerçekleşir, bu nedenle VB6 ActiveX DLL'si yalnızca bir referanstır. COM dolaylı kullanımı kullanır ve IDE'de VB6 kodunu çalıştırırsam, her şey mükemmel çalışır.

Bir şeyi Yönetici olarak çalıştırmayı denedim, ancak hiçbir şey değişmedi.

Bu sorunu gidermek için nereye gidebilirim?

+0

Windows'un eski sürümüyle uyumluluk içinde çalışmayı denediniz mi? Yürütülebilir dosyayı sağ tıklayın ve Uyumluluk sekmesine gidin; bazen sihir gibi çalışır. – BeemerGuy

+0

@BeemerGuy, Evet. Bunu söylemeyi unuttum - evet, uyumluluk modunu denedim - işe yaramadı. – AngryHacker

+0

VB6 kodunu bir VB uygulamasından çalıştırırsanız başarısızlığı yeniden üretebilir misiniz? Eğer öyleyse, VB hata ayıklayıcısını daha hassas bir şekilde izlemek için kullanabilirsiniz. –

cevap

3

DEP'yi kapatın. Eski Axe Kontrolleri, NX bayrağını kurmayı umursamayan korkak alt sınıflandırma (ATL/MFC olanlar hariç) kullanma eğilimindedir.

+0

Dang, sen aradın. Şimdi ne var? Bunu düzeltmenin kolay bir yolu var mı yoksa 10 yıllık bir ızgarayı 10 yıllık bir ızgarayla mı değiştiriyorum? – AngryHacker

2

Özellikle 64 bit sistemlerde çalıştırıyorsanız, herhangi birCPU yerine x86 hedefini derlediğinizden emin olun. 64 bit Windows 7 sisteminde daha eski bir 32 bit DLL ile herhangi bir CPU kullandığınızda ve eski IBM elkitaplarından alıntı yapmak için "sonuçlar tahmin edilemez."

+0

Sonuçlar oldukça öngörülebilir. 64 bit Windows sistemindeki AnyCPU'lar 64 bit bir işlem oluşturur ve 32 bit DLL daha sonra yüklenmez. 32 bit DLL dosyasının yaşı hiç önemli değil. –

+0

Doğru, ancak hata iletisi oldukça değişken olabilir. – xpda

+0

Win7 bu durumda 32 bit, bu yüzden sorun değil. – AngryHacker

İlgili konular