2

インターフェイスを A.idl ファイルで定義し、それを A.tlb にコンパイルします。

VS2005 ATL プロジェクト "B" では、B.idl で importlib(A.tlb) を使用し、stdafx.h で #import "A.tlb" を使用し、ATL COM クラスで A.tlb からインターフェイス IA を実装します。プロジェクトは B.dll と B.tlb を出力します

B.tlb を C# アプリケーションの参照に追加し、コード内で COM オブジェクトをインスタンス化します。

どちらを使用しても、インスタンス化は問題なく機能します

Type.GetTypeFromCLSID(); Activator.CreateInstance(...);

また

[DllImport("ole32.dll", ...)] CoCreateInstance(...)

どちらも問題なく動作し、オブジェクトがインスタンス化され、A.tlb (実際には tlb から生成された RCW) で定義された IA インターフェイスにキャストして、そのメソッドを呼び出すことができます。それでも問題ありません。

次に、OLEView を使用して、既定の DllHost.exe サロゲートを使用して COM オブジェクトのアクティブ化を有効にします。

サロゲート内の COM オブジェクトのインスタンス化(CoCreateInstance のパラメータ CLSCTX_LOCAL_SERVER) にはまだ問題はありませんが、オブジェクトを A.tlb で定義された IA インターフェイスにキャストしようとすると、E_NOINTERFACE が表示され、QueryInterface が失敗したというメッセージが表示されます。サポートされているインターフェース」。

助けてください。何が間違っている可能性がありますか?追加情報が必要な場合は、可能な限り提供するように努めます。

4

1 に答える 1

2

プロキシ/スタブDLLをビルドして登録する必要があります。プロセスの境界を越えてインターフェースをマーシャリングするために必要です。優れたMSDNページが見つかりませんが、ここに記載されています

于 2010-12-01T13:06:07.200 に答える