2013-07-25 70 views
4

這裏是抄錄錯誤一個示例應用程序的鏈接: http://sdrv.ms/17j2Ale的Crystal Reports瀏覽器的ActiveX導致內存溢出異常在VB6/.NET應用程序的Windows 7

我有三個項目。一個是.NET 2.0 Windows Forms應用程序(.NET App),一個是VB6標準EXE應用程序(VB App),另一個是VB6 ActiveX DLL(VB DLL)。 .NET應用程序引用已註冊的VB DLL。這個VB DLL基本上啓動了Crystal Reports。 VB應用程序通過Shell()命令啓動.NET應用程序。以下是發生了什麼:

如果我直接運行.NET應用程序,則可以毫無問題地打開Crystal Reports文檔。但是,當VB應用程序通過Shell()命令啓動.NET應用程序時,當.NET應用程序嘗試打開Crystal Reports文檔時,出現Out of Memory錯誤。

現在這裏是踢球者 - 這適用於Windows XP,但是當我們嘗試在Windows 7 64-bit中啓動它時,我們遇到了這個問題。我確信這裏有一個簡單的解決方案。任何接受者?

您可以跳轉到更新5,在此處我縮小了問題範圍。

更新:我也嘗試創建第二個.NET 2.0的Windows窗體應用程序(.NET啓動器),並通過從它推出的.NET應用程序:

Process.Start(@"C:\Path\OtherApp.exe"); 

,當我試圖打開在.NET應用程序中的Crystal Reports文檔仍然給我提供了同樣的Out of Memory錯誤。

更新 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應用程序執行V​​B6代碼。內存不足異常來自此行:

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:我使用了Procmon。Sysinternals公司的exe文件,並生成可以在這裏找到一個日誌文件:

http://sdrv.ms/194aO7A

+0

你確保所有的組件都建在'Release'模式?這個問題是相反的,但可能是相關的(http://stackoverflow.com/questions/1723797/vb6-app-calling-net-dll-outofmemory-exception)。你也可以確認Win7機器上所有需要的依賴關係嗎? – keyboardP

+0

@Zach:我不知道這是否可能。是否可以運行此應用程序與64位環境兼容?我的猜測是vshost可能會爲你做一些命令行參數。 – shahkalpesh

+0

我試着在發佈模式下運行。另外我相信我的目標是x86平臺。我真的很想知道vshost對運行環境的作用。 – Zach

回答

0

我發現一種解決方法解決存儲器外的錯誤;但是,這不是一個允許的解決方案。顯然,這個問題在crviewer.dll的未來版本中解決,但老總UHER使得它在給我的問題在這裏迴應很明確:http://scn.sap.com/thread/3405856,我們是不允許11.5後繼續使用的版本,由於許可限制。這似乎是他收到的一個常見問題。不幸的是,我們不得不接受我們將應用程序升級到.NET的迴應。如果其他人感覺冒險足以嘗試解決內存不足的異常問題,那麼我會很樂意將我的示例項目提供給任何願意冒險的人。祝所有人感到我對CR 11.5互操作性支持的痛苦。

1

不知道這些信息將幫助,但我已經與水晶過去面臨類似的問題,並在Web窗體應用程序。我通過確保應用程序池具有「啓用32位應用程序」選項來檢查它嗎?您可以在高級設置中找到它 - >一般....

+0

謝謝你的鏈接。我相信你的信息與user743414的迴應有關。 – Zach

1

當我使用32位C/C++我有這樣的問題 - DLL文件與64位Windows上運行.NET代碼。 如果您的.NET項目具有「任何平臺」作爲目標,那麼運行時將代碼編譯爲64位Windows上的64位,在32位Windows上我認爲您沒有問題。

你有你的目標平臺設置爲「86」,你寫你這樣做。請驗證您的.NET解決方案中的所有.NET項目都設置爲x86作爲目標。

的水晶報表的* .dll應該是一個32位的COM * .dll文件,和VB6 * .DLL了。

+0

謝謝,但是我已經意識到這一點。沒有選擇適當的平臺,它將不會編譯。我已經將我的構建配置設置爲針對x86平臺。 – Zach

相關問題