这是重现错误的示例应用程序的链接:http : //sdrv.ms/17j2Ale
我有三个项目。一种是.NET 2.0 Windows Forms 应用程序(.NET App),一种是VB6 标准EXE 应用程序(VB App),另一种是VB6 ActiveX DLL(VB DLL)。.NET App 引用已注册的 VB DLL。这个 VB DLL 本质上是启动 Crystal Reports。VB 应用程序通过 Shell() 命令启动 .NET 应用程序。这是发生的事情:
如果我直接运行 .NET App,我可以毫无问题地打开 Crystal Reports 文档。但是,当 VB 应用程序通过 Shell() 命令启动 .NET 应用程序时,当 .NET 应用程序尝试打开 Crystal Reports 文档时,出现内存不足错误。
现在这是踢球者 - 这在 Windows XP 上有效,但是当我们尝试在 Windows 7 64 位中启动它时,我们遇到了这个问题。我确信必须有一个简单的解决方案。有接盘侠吗?
您可以跳到我缩小问题范围的更新 5。
更新:我还尝试创建第二个 .NET 2.0 Windows 窗体应用程序(.NET 启动器),并通过以下方式启动 .NET 应用程序:
Process.Start(@"C:\Path\OtherApp.exe");
当我尝试在 .NET 应用程序中打开 Crystal Reports 文档时,它仍然给我同样的内存不足错误。
更新2:由于更新 4 而被删除
更新3:所以今天我发现 .NET App 在直接启动时能够打开报告的原因是因为我在 Visual Studio 中启动它。当我在 Visual Studio 之外尝试可执行文件时,错误返回。我注意到 Visual Studio 自 2005 年起开始使用 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
所以在 vshost.exe 里面,这个表单可以初始化,但不能没有它。
更新5:我已将问题范围缩小到 Crystal Reports ActiveX 查看器。我从头开始了一个新的 VB ActiveX DLL 项目,并且只从一个表单开始。这在各个方面都有效。然后我添加了 Crystal ActiveX Report Viewer Library 11.5 - 错误返回了!它绝对是报表查看器。有人告诉我,这个问题可以通过简单的注册表调整来解决。
更新6:我使用了 Sysinternals 的 Procmon.exe 并生成了一个日志文件,可以在这里找到: