2017-04-07 5 views
0

私は、COMコントロールをc#.Net 4.5で作成しました。このCOMコントロールはサードパーティのDLLを使用してUSBデバイスと通信します。COM関数はVBscriptで失敗しますが、Win64ではVB6ではありません

Windows 7の32ビット版では、VBScriptとVB6の両方から100%完全に動作します。 Windows 7 64ビットでは、USBデバイスを使用するサードパーティのdll関数を呼び出すときにVBScriptが失敗します。

"System.AccessViolationException"メッセージ: "保護されたメモリを読み書きしようとしました。これは他のメモリが壊れていることを示していることがよくあります。

私が理解していないのは、同じCOMコントロール(および同じUSBドライバ)がVB6アプリケーションからインスタンス化されたときに動作するが、VBScriptからはインスタンス化されないということです。

私は、VB6アプリケーションとVBScriptを実行しているときにプロセスモニタを使用してロードされたアセンブリとレジストリアクセスを調べましたが、普通のものは見えません。

私がトラブルシューティングや次のテストができることの提案はありますか?

+1

VB6はいつも私が思った32ビットである、のようなあなたのDLLを登録します。 – BugFinder

+1

はい、* op *が実際にVBAを意味する場合を除きます。たとえそうでなくても、この質問には詳細が必要だと思っています。少なくとも、何が試されたのか、問題を引き起こす関連する実例、エラーコードなどを表示してください。 – acelent

+2

c:\ windows \ syswow64 \ cscript.exe "myScript.vbs' –

答えて

0

ここでは取引があります。 VB6から書かれたアプリケーションは32ビットです。あなたのアプリケーションは、32ビット版のWindowsとWindows 64上のVB6アプリケーション(VB6は32ビット版を生成するため、32ビット版として動作しています)で動作しますので、ご使用のDLLは32ビット版で動作します。

問題は、Windows 64でVBスクリプトを実行すると、64ビットプロセスとして実行され、32ビットDLLとの不一致があることです.VBスクリプトを32ビットバージョンのVBスクリプトで実行すると

ここで、AnyCPUプロセッサの設定でDLLをコンパイルした場合、次のようなエラーメッセージが表示されます。 DLLを登録して64ビットプロセスで動作させることができます。64ビットハイブにあるregasm.exeを必ず使用してください。

は、例えば、64ビットかどうか、その32ビット上で実行されている結果として..

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

関連する問題