我有一个.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代码,则一切正常。
我已经尝试运行的东西作为管理员,但没有任何改变。
我在哪里可以去解决这个问题?
您是否尝试过与旧版Windows的兼容性?用鼠标右键单击该可执行文件并转到兼容性选项卡;有时候就像魔术一样。 – BeemerGuy 2010-11-19 01:01:45
@BeemerGuy,是的。我忘了提及 - 是的,我尝试了兼容模式 - 它不起作用。 – AngryHacker 2010-11-19 01:04:49
如果您从VB应用程序中运行VB6代码,是否可以重现该故障?如果是这样,你可能能够使用VB调试器更精确地追踪它。 – 2010-11-19 02:47:24