0

我有一个用 C#.Net 编写的应用程序(如果重要,框架 2.0)。它调用一个 VB6 exe,该 exe 使用一种方法公开一个 COM 类 - 显示一个表单。

当 VB 窗体关闭时,我收到系统错误(Windows 消息):无法读取内存位置。然后,Windows 询问我是关闭应用程序还是调试它。我选择什么并不重要,因为测试机器上没有安装调试器,当我选择调试时,它会给我一条消息,它必须关闭。

该错误仅在两种情况下发生(两者都必须适用):

  • 当它在 Windows 2000 下运行时。
  • 此外,只有当我首先单击“显示报告”按钮时才会发生这种情况,该按钮调用另一个 COM DLL - Crystal 报告 - 来生成报告。

基本上,流程是这样的:

    C#.Net 应用程序
     |-- MDI表格
          | 单击窗体上的按钮时,调用 VB6 方法
          +-- 显示表格。调用 setParent(VBForm.Handle, DotNetForm.Handle)
          | 并显示表格。被调用的方法返回(没有返回值)
          | |
          | +-- 点击“显示报表”时,使用水晶报表生成报表并展示给用户
          | |
          | \-- 单击退出按钮时,表单关闭 -这是发生错误的地方
          |
          \-- .Net 形式在内部形式关闭后仍然存在很长时间

有谁知道什么可能导致这样的错误?VBOn Error Goto在整个 Main 方法周围有一条线,它应该捕获 VB 中的任何错误 - 但它没有。但是,错误确实来自 VB 生成的 EXE 文件。

4

1 回答 1

1

您可以通过附加一个非托管调试器并查看堆栈跟踪是什么来确认 VB exe 中的哪个模块正在崩溃。

Crystal Reports 听起来可能是罪魁祸首,但也有可能是其他原因引发了问题。假设您可以访问 VB 代码,我将检查所有 Crystal Report COM 对象是否正确释放。如果遗留了一些东西,那么它可能会与应用程序关闭进行不良交互。

如果您想要一个非常老套的解决方案,您可以考虑在 OnClose 事件中调用 Win32 TerminateProcess 函数。这将在不通知任何附加的 DLL 的情况下终止进程……不漂亮,并可能导致与数据库的连接悬空,等需要自行清理(可能在超时时)。

于 2008-12-30T02:03:59.220 回答