2012-02-01 52 views
1

私はC++を呼び出すためのC#COM相互運用機能を作成します。 私はregasmによってdllとtlbファイルを登録しました。 私はC#のコードを変更しました(私はインターフェイスの定義を変更していませんでした。ただ実装が変更されました)。 COMの1つのインターフェイスがエラー0x80131509を返します。奇妙なことは、一部のコンピュータでしか起こらないことです(私のPCの開発はうまくいくので、この問題をデバッグすることはできません)。 C#COMがC++でどのように働いていたかは、私が登録した後、ウィンドウレジストリでキー値を作成することがわかりました(regasm/regfileが生成したもの)。 COM dllがどこにあるかをC++がどのように知っているか(検索パス環境変数)どのような実行時にtlbファイルの使用ですか?C++ COM interopエラーを呼び出す:HRESULT 0x80131509

どのような提案ですか?

答えて

0

あなたの問題はレジストリに関連していると思います...この問題が発生しているコンピュータでは、登録を解除して(regasmを使用して)dllを登録してください。

これらのコンピュータでdllの登録を解除すると、regeditを使用してそれを参照する欠落しているレジストリキーを検索して削除した後、dllを再度登録してください。欠落しているキーを削除した後、レジストリクリーナープログラムの1つを使用して、何も見逃していないことを保証することもできます。

アプリケーションで使用するディレクトリにdllを常に登録する必要があることを覚えておいてください。これは一度だけ行う必要があります。 dllの登録を解除する必要がある場合は、登録に使用したのと同じディレクトリに登録してください。つまり、DLLが登録されたらを移動しないでください。

注:DLLがC++アプリケーションと同じパスにない場合は、PATH環境変数で参照されるディレクトリに存在する必要があります。

+2

ご返信ありがとうございます。今日、私は問題のPCにログインし、最終的にそれが間違っている理由を見つける。それは例外をスローされたC#COMの部分のためですが、私はそれをキャッチしませんでした。私はそれが再現できない理由は、彼らが差異データベースに接続していることです。 – ArdenZhao

0

Visual FoxProから.Net4 C#COMオブジェクトを呼び出すときに同じエラーメッセージが表示されました。

このメソッドはオブジェクトを返します。オブジェクトの型はいくつかのうちの1つです。すべての型は、これらの型の共通のものとのインタフェースを実装した抽象クラスから派生しています。

最終的には、基本クラスから抽象修飾子を削除し、それをpublicおよびComVisibleにすることにしました。これは、私が基本クラスを抽象的にしたいとは思っていても、私の問題を解決しました。

関連する問題