2011-01-20 3 views
0

私は最近までVB6で動作していた古くからのCOMオブジェクトを持っています。 (彼らはすべてではありません)。 (svnによって検証されたように)行われた唯一のコード変更は、配列に新しい文字列リテラルを含めることです。VB6 COMオブジェクト - IDEの実行中のみ機能しますか?

VB6 IDEはオブジェクトを細かくコンパイルします。私は実行を打つとき| ...起動し、コマンドプロンプトから次のテストVBスクリプトを実行し、オブジェクトが正常に動作し、私は私が期待してダイアログボックスを参照してください。

dim o 

set o = CreateObject("MyDll.MyClassName") 

wscript.Echo "Testing object" 
wscript.Echo o.HelloWorld  ' runs a test method that returns "Hello World" 
wscript.Echo "Done" 

しかし、私はIDEでデバッグを停止する場合そして、同じコマンドプロンプトから同じVBScriptを実行しようと、私はエラーを取得:

alt text

(ProgIDがセキュリティ上の理由から削除されますが、それは、スクリプトと同じです。)

物事を私は試しました:

  1. 私は、DLLが登録および未登録VBで私が起動したときに、デバッガを停止された可能性があることが疑わので、私はまた、テストスクリプトを実行する前に、regsvr32でオブジェクトを登録しようとしました。これは効果がありませんでした。

  2. また、レジストリからDLLへの参照をすべて削除し、オブジェクトを再登録しました。同じエラー。

  3. 私はDLLを削除し、VB(File | Make ...)から再構築してDLLを再登録しました。同じエラー。

マシンはWin7 Ultimate x64、VB6でビルドされたオブジェクトです。

提案がありますか?

残念ながら、C#でオブジェクトを書き直すことはできません。

+0

正確に実行されますどのようなあなたはデバッガを起動しますか?これは実際にEXEプロジェクトですか?その後の動作は正常です。 –

+0

プロジェクトはEXEではなくActiveX DLLです。 「実行」をクリックすると、IDEが何をしているのか分かりません。 –

答えて

1

Microsoftは、それが依存関係の問題のいくつかの並べ替えだと言う:それは働いているので、あなたがIDEでオブジェクトを実行すると、これは4つの可能性が残りますhttp://support.microsoft.com/kb/194801

  1. のActiveX DLL自体が上にありませんシステムパス。
  2. ActiveX DLLはシステムパス上にないものに依存します。
  3. dllを登録すると、何らかの理由でセキュリティが強化されて実行する必要があるとマークされます。
  4. dllを登録すると、それに依存するものは実行するにはセキュリティの強化が必要です。

私は、管理者としてコマンドプロンプトを開き、オブジェクトを起動するvbscriptファイルを実行しようとします。それがうまくいくなら問題は#3か#4のどちらかであることを意味します。そうでない場合は、#1または#2を意味します。

ActiveX DLLに外部依存関係がない場合は#2と#4を削除できます。

次に、私はイベントログを見て、他のエラーがウィンドウに記録されているかどうかを確認します。

UPDATE

はちょうど別の原因を発見しました。 ActiveX dllが32ビットの場合、スクリプトは32ビット版のスクリプトエンジンを使用して実行する必要があります。それ以外の場合は、デフォルトのスクリプトエンジン(そのマシンのx64)が文字通りdllを見つけることができないため、このエラーが発生します。

私は\ windows \ system32 \ cscript.exeを使ってvbscriptを実行するといいと思います。

+0

答えをありがとう。私はそれを32ビットモードで実行しています。IDEで動作していれば、どのように依存関係が失われているのか疑問に思っています。 DLLのパーミッションは問題になるかもしれませんが、私はすべての人に完全な制御権を与えるためにファイルパーミッションを変更しています。これはc:\ windows \ system32にインストールされています。アー。 –

1

まあ、それは間違いなく、上記の提案は正しい..ですので、32ビットのDLLの問題のように聞こえるが、パスが間違っている.. CからCSCRIPTを使用してみてください:\ WINDOWS \ SYSWOW64は...

関連する問題