Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET/VB6应用程序在Windows 7上失败_C#_Visual Studio 2008_Vb6_Windows 7_Access Violation - Fatal编程技术网

C# .NET/VB6应用程序在Windows 7上失败

C# .NET/VB6应用程序在Windows 7上失败,c#,visual-studio-2008,vb6,windows-7,access-violation,C#,Visual Studio 2008,Vb6,Windows 7,Access Violation,我有一个.NET 3.5 winforms应用程序,它调用VB6 ActiveX DLL中的一个方法,从而打开一个对话框。在将近10年的时间里,一切都运转良好,首先是作为.NET1.1应用程序,然后是2.0,然后是3.5,都是在WindowsXP上运行的。现在客户已升级到Windows 7,我遇到System.AccessViolationException:尝试读取或写入受保护的内存。这通常表示其他内存已损坏 调用的结构如下所示: .NET代码 VB6Object类中的VB6代码 问题从这一行

我有一个.NET 3.5 winforms应用程序,它调用VB6 ActiveX DLL中的一个方法,从而打开一个对话框。在将近10年的时间里,一切都运转良好,首先是作为.NET1.1应用程序,然后是2.0,然后是3.5,都是在WindowsXP上运行的。现在客户已升级到Windows 7,我遇到System.AccessViolationException:尝试读取或写入受保护的内存。这通常表示其他内存已损坏

调用的结构如下所示:

.NET代码

VB6Object类中的VB6代码

问题从这一行的VB6代码开始:调用frmPopup.ShowvbModal。错误会传播到.NET代码。VB6代码中的错误处理程序在我处理错误的地方被完全忽略。我原以为问题可能是frmPopup的加载事件,但代码从未到达加载事件我到处都有跟踪语句,所以我就是这样知道的

有趣的是,我第二次打电话时,它根本没有失败,但表单缺少第三方网格ActiveX-DevXPress Quantum网格,因此我假设网格可能与Windows 7不兼容

我所描述的一切都是在我以EXE或VS2008 IDE的形式运行应用程序时发生的,因此VB6 ActiveX DLL只是一个参考。如果我使用COM间接寻址并在IDE中运行VB6代码,那么一切都可以正常工作

我试着以管理员的身份运行,但没有任何改变


下一步我可以去哪里解决此问题?

确保您是针对x86目标而不是任何CPU进行编译,尤其是在64位系统上运行时。在64位Windows 7系统上,如果将anyCPU与旧的32位DLL一起使用,则会出现某种冲突,引用旧的IBM手册,结果是不可预测的。

请确保编译的是x86目标而不是anyCPU,尤其是在64位系统上运行时。在64位Windows 7系统上,如果将anyCPU与旧的32位DLL一起使用,则会出现某种冲突,引用旧的IBM手册,结果是不可预测的。

关闭DEP。旧的Ax控件倾向于使用时髦的子类化thunk,而不是ATL/MFC控件,因为没有人愿意关闭NX标志。

关闭DEP。旧的Ax控件倾向于使用时髦的子类化thunk,而不是ATL/MFC控件,没有人愿意关闭NX标志。

您是否尝试过与旧版本的Windows兼容运行?右键单击可执行文件并转到兼容性选项卡;“有时候这就像魔术一样奏效。”比默盖伊,是的。我忘了提到这一点-是的,我尝试过兼容模式-它不起作用。如果你在VB应用程序中运行VB6代码,你能重现失败吗?如果是这样,您可能可以使用VB调试器更精确地跟踪它。@如果我在VB IDE中运行ActiveX DLL(如我提到的使用COM间接寻址),一切都会正常工作。您是否尝试与旧版本的Windows兼容运行?右键单击可执行文件并转到兼容性选项卡;“有时候这就像魔术一样奏效。”比默盖伊,是的。我忘了提到这一点-是的,我尝试过兼容模式-它不起作用。如果你在VB应用程序中运行VB6代码,你能重现失败吗?如果是这样,您可能可以使用VB调试器更精确地跟踪它。@Dan如果我在VB IDE中运行ActiveX DLL(如我提到的使用COM间接寻址),一切都会正常工作。结果是可以预测的。64位Windows系统上的任何CPU都会创建一个64位进程,然后将不会加载32位DLL。32位DLL的使用期限根本不重要。在这种情况下,Win7是32位的,所以这不是问题所在。结果是可以预测的。64位Windows系统上的任何CPU都会创建一个64位进程,然后将不会加载32位DLL。32位DLL的使用年限根本不重要。在本例中,Win7是32位的,所以这不是问题所在。该死,你叫它。现在怎么办?有没有一个简单的方法来解决这个问题,或者我要用另一个10年前的网格替换一个10年前的网格?该死,你叫它。现在怎么办?有没有一个简单的方法来解决这个问题,或者我要用另一个10年的网格替换一个10年的网格?
try {
  VB6Object obj = new VB6Object();
  obj.DoStuff();
}
catch (Exception ex) {  // handle }
Public Sub DoStuff()
    on error goto errHandle
    RetrieveData();

    Call frmPopup.Show(vbModal)

exitPoint:
    exit sub
errHandle: 
    ' handle error
End Sub