2010-11-19 106 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