2010-11-19 78 views
1

我有一個.NET 3.5 WinForms應用程序調用在VB6的ActiveX DLL,它會彈出一個對話框的方法。一切運行良好近10年(首先作爲.NET 1.1應用程序,然後2.0,然後3.5,所有在Windows XP上)。現在,客戶已經升級到Windows 7,我遇到了通話的System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt..NET/VB6應用程序無法在Windows 7

的結構是這樣的:

.NET代碼

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

在VB6Object類VB6代碼

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

    Call frmPopup.Show(vbModal) 

exitPoint: 
    exit sub 
errHandle: 
    ' handle error 
End Sub 

該問題從VB6代碼開始在這條線上:Call frmPopup.Show(vbModal)。錯誤傳播到.NET代碼(在VB6代碼中的錯誤處理程序完全忽略),我處理錯誤。我認爲這個問題可能是frmPopup的Load事件,但代碼永遠無法到達Load事件(我在遍地都有跟蹤語句,所以這就是我所知道的)。

有趣的部分是,我第二次打電話時,它根本沒有失敗,但窗體缺少第三方網格(ActiveX DevExpress Quantum Grid),所以我假設網格可能不是我所描述的兼容某種程度上與Windows 7

發生的一切時,我只需運行該應用程序爲EXE或從VS2008 IDE,所以VB6的ActiveX DLL是一個簡單的參考。如果我使用COM間接方式並在IDE中運行VB6代碼,則一切正常。

我已經嘗試運行的東西作爲管理員,但沒有任何改變。

我在哪裏可以去解決這個問題?

+0

您是否嘗試過與舊版Windows的兼容性?用鼠標右鍵單擊該可執行文件並轉到兼容性選項卡;有時候就像魔術一樣。 – BeemerGuy 2010-11-19 01:01:45

+0

@BeemerGuy,是的。我忘了提及 - 是的,我嘗試了兼容模式 - 它不起作用。 – AngryHacker 2010-11-19 01:04:49

+0

如果您從VB應用程序中運行VB6代碼,是否可以重現該故障?如果是這樣,你可能能夠使用VB調試器更精確地追蹤它。 – 2010-11-19 02:47:24

回答

3

關閉DEP。老的Ax控件傾向於使用時髦的子類(除ATL/MFC之外),沒有人關心設置NX標誌。

+0

Dang,你叫它。現在怎麼辦?有沒有簡單的方法來解決這個問題,還是我用另一個10年的電網取代10年的電網? – AngryHacker 2010-11-25 00:53:13

2

確保您編譯爲x86目標,而不是anyCPU,特別是如果你在64位系統上運行。當您在64位Windows 7系統上使用任何帶有較舊32位DLL的CPU時會發生某種衝突,並且引用舊的IBM手冊時,「結果是不可預知的」。

+0

結果是相當可預測的。 64位Windows系統上的AnyCPU創建64位進程,然後32位DLL不會被加載。 32位DLL的年齡根本不重要。 – 2010-11-19 06:21:20

+0

是的,但錯誤信息可能相當多變。 – xpda 2010-11-19 06:24:56

+0

Win7在這種情況下是32位,所以這不是問題。 – AngryHacker 2010-11-19 07:30:25

相關問題