Crystal Reports ActiveX Viewer 在 VB6 / .NET App Windows 7 中导致内存不足异常

Zac*_*ach 5 c# vb6 appdomain out-of-memory crystal-reports

这是重现错误的示例应用程序的链接http : //sdrv.ms/17j2Ale

我有三个项目。一个是.NET 2.0 Windows Forms应用程序(.NET App),一个是VB6 Standard EXE应用程序(VB App),另一个是VB6 ActiveX DLL(VB DLL)。.NET 应用程序引用已注册的 VB DLL。这个 VB DLL 本质上是启动 Crystal Reports。VB 应用程序通过 Shell() 命令启动 .NET 应用程序。这是发生的事情:

如果我直接运行 .NET App,我可以毫无问题地打开 Crystal Reports 文档。但是,当 VB 应用程序通过 Shell() 命令启动 .NET 应用程序时,当 .NET 应用程序尝试打开 Crystal Reports 文档时,出现内存不足错误。

现在是关键 - 这在 Windows XP 上有效,但是当我们尝试在 64 位 Windows 7 中启动它时,我们遇到了这个问题。我相信一定有一个简单的解决方案。有接班人吗?

您可以跳到更新 5,我在那里缩小了问题的范围。

更新:我还尝试创建第二个 .NET 2.0 Windows 窗体应用程序(.NET Launcher),并通过以下方式启动 .NET 应用程序:

Process.Start(@"C:\Path\OtherApp.exe");
Run Code Online (Sandbox Code Playgroud)

当我尝试在 .NET 应用程序中打开 Crystal Reports 文档时,它仍然给我同样的内存不足错误。

更新2:由于更新 4 删除

更新3:所以今天我发现 .NET 应用程序在直接启动时能够打开报表的原因是因为我在 Visual Studio 中启动它。当我在 Visual Studio 之外尝试可执行文件时,错误返回。我注意到,从 2005 年开始,Visual Studio 开始使用 vshost.exe 来启动 Windows 应用程序以加快调试启动:http : //blogs.msdn.com/b/dtemp/archive/2004/08/17/215764。 aspx 当我禁用 vshost 功能时,返回内存不足错误。所以我想问题是,这个 vshost 进程在做什么使它可以在 Windows 7 上工作?

更新4:我能够使用调试信息编译 VB6 DLL,并将源代码和调试信息加载到 Visual Studio 中,并在 .NET 应用程序执行 VB6 代码时单步执行。Out of Memory 异常来自这一行:

Dim myForm As frmTheForm

Set myForm = New frmTheForm 'OOM Error right here
Run Code Online (Sandbox Code Playgroud)

所以在 vshost.exe 中,这个表单可以初始化,但不能没有它。

更新5:我已将问题缩小到 Crystal Reports ActiveX 查看器。我从头开始了一个新的 VB ActiveX DLL 项目,并且只从一个表单开始。这在各个方面都有效。然后我添加了 Crystal ActiveX Report Viewer Library 11.5 - 错误返回!它绝对是报表查看器。我听说这个问题可以通过简单的注册表调整来解决。

更新6:我使用了 Sysinternals 的 Procmon.exe 并生成了一个日志文件,可以在这里找到:

http://sdrv.ms/194aO7A

Zac*_*ach 1

我找到了解决内存不足错误的解决方案;然而,这不是一个允许的解决方案。显然,这个问题在 crviewer.dll 的未来版本中得到了解决,但 Uher 先生在回答我的问题时非常明确地表示: http: //scn.sap.com/thread/3405856我们不允许使用由于许可限制,11.5 之后的版本。这似乎是他收到的一个常见问题。不幸的是,我们被迫接受将应用程序升级到.NET 的答复。如果其他人有足够的冒险精神尝试解决内存不足异常,我很乐意将上面的示例项目提供给任何希望尝试的人。祝其他感受到 CR 11.5 互操作支持痛苦的人好运。