2017-04-07 112 views
0

我在c#.Net 4.5中編寫了一個COM控件,這個COM控件使用第三方dll與USB設備進行通信。COM函數在VBscript上失敗,但在Win64上不能VB6

在Windows 7 32bit上,VBScript和VB6應用程序都可以100%工作。在Windows 7 64位上,調用使用USB設備的第三方dll函數時VBScript失敗。

例外情況是:「System.AccessViolationException」消息:「試圖讀取或寫入受保護的內存,這通常表示其他內存已損壞。」

我不明白的是,相同的COM控件(和相同的USB驅動程序)從VB6應用程序實例化,但不是從VBScript中工作。

我在運行VB6應用程序和VBScript時使用進程監視器查看了加載的程序集和註冊表訪問,但我看不到任何不尋常的東西。

任何關於我可以排除故障或測試的建議?

+1

VB6始終是32位我以爲,作爲64位與否,它的32位運行的結果。 – BugFinder

+1

是的,除非* op *實際上是指VBA。即使不是這樣,我認爲這個問題需要更多的細節,至少要展示已經嘗試過的東西,提出問題的相關工作示例,錯誤代碼等。 – acelent

+2

嘗試將其作爲'「c:\ windows \ syswow64 \ cscript.exe「myScript.vbs」 –

回答

0

這是交易。從VB6編寫的應用程序是32位。您的應用程序可以在32位Windows上運行,也可以從Windows 64上的VB6應用程序運行(它是32位運行的,因爲VB6會生成32位),因此我們知道您的DLL可以在32位應用程序中運行。問題是,當你在Windows 64上運行一個VB腳本時,它將作爲一個64位進程運行,並且與你的32位DLL不匹配。如果你使用32位版本的VB腳本運行VB腳本引擎(c:\ windows \ syswow64 \ wscript.exe或c:\ windows \ syswow64 \ cscript.exe)是否可以正常工作?它可能會。

現在,如果您使用AnyCPU處理器設置編譯DLL,你仍然可以註冊你的DLL,並讓它與64位進程一起工作。只要確保使用64位配置單元中的regasm.exe。

例如註冊DLL因爲如此,

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /tlb /codebase c:\path\to\yourdll.dll 
+0

我做了一個控制檯應用程序,只包含有問題的代碼(使用來自第三方DLL的USB設備)。這個控制檯應用程序是爲x86編譯的,它仍然會引發異常。我已經嘗試編譯.NET 2.0的控制檯應用程序,我得到了相同的結果。我感覺VB6加載了第三方USB驅動程序需要的某些程序集或模塊,但是比較來自我的測試應用程序和VB6應用程序的加載模塊顯示加載了相同的模塊。 – Xtr

+0

您可以使用進程監視器1)查看正在拋出異常之前正在讀取什麼文件或正在讀取註冊表項2)查看VB6應用程序正在加載哪些模塊或註冊表項 –

+1

正如我的問題中提到的,這正是我將VBScript加載模塊與VB6應用程序進行比較時所做的,他們都從相同的位置加載相同的模塊,並訪問相同的註冊表項。 – Xtr

相關問題