1

在这个嵌入了一些旧 Crystal Reports 查看器的 MFC 应用程序上,退出时我遇到了崩溃 (the instruction at ... referenced memory at ...; the value could not be "read").

无法在调试模式下运行,因为它只能在没有安装 Visual Studio 的 PC 上重现,而且我没有备用许可证可供使用。

我添加了一些日志记录,卸载 u2dpost.dll 的 FreeLibrary 调用失败(句柄不知何故变得无效)。

崩溃似乎出现在无法卸载的 dll 中的某些代码中。

我可以强制卸载吗?我愿意避免崩溃。

调用exit(0)(虽然丑陋)仍然会导致崩溃。

指令的地址相对于应用程序打开的报告是恒定的。

在另一台 PC(相同的 XP SP3 操作系统,相同的 Crystal dll,只是 Oracle 11g 与 10g)上,调试可能很容易(安装了 Visual C++),崩溃不会重现。

在有问题的 PC 上,它一直发生,如果我启动导出对话框(然后关闭它或实际导出,它没有区别)。

我该如何从这里开始?

编辑:

我发现这有一点不同:

IDatabasePtr pDB = pRep->GetDatabase();

pDB->AddRef(); // 使用这一行,它会在 XP 电脑上崩溃;没有它,它会在我的 Windows 7 工作站上崩溃

(Win & crash 在 CCmdTarget::OnFinalRelease() 最后一行:删除这个;)有什么建议吗?

4

1 回答 1

0

如果它有帮助,我在使用我们的一款旧软件时也面临同样的问题。

我测试了我的 sw 的调试版本并使用 DebugDiag 来捕获崩溃,结果发现当(释放)一些水晶报告接口(由 com 析构函数自动)时,它崩溃了。所以我最终向有问题的界面添加了一个额外的 AddRef。仅当 windows 版本为 7 或以上时。

于 2016-06-21T11:55:50.030 回答