4

COM IUnknown ベースのオブジェクトへのポインターを返すアンマネージ C ルーチンをエクスポートするライブラリがあります。DLL は登録されておらず、サーバーではありません。C# の COM 型を使用したいと考えています。

COM 型の C# インターフェイスは既に作成しています。LoadLibrary() と GetProcAddress() の呼び出しに相当する C# は何ですか? GetProcAddress() の結果を呼び出してから、それを呼び出して COM インターフェイス ポインターをロードするにはどうすればよいでしょうか?

これは、私が何を求めているかを示す C++ のスニペットです。

// Assume I have previously declared IMyType
HANDLE mylib = ::LoadLibrary("myfakecom.dll");
IUnknown* (*GetterFunc) getter;
getter = (GetterFunc)::GetProcAddress(mylib, "GetFactory");
IUnknown *unk = getter();
IMyType *mytype = unk->QueryInterface(IID_MYTYPE);

私の直感は「C++/CLI で実行してください」と言いますが、ジェネリック型に対してこれを行う方法と、[Guid] 属性を使用して宣言するマネージャー ポインター型に未加工の IUnknown ポインターを強制する方法がわかりません。管理されたインターフェイスで。

4

1 に答える 1

2

GetFactory次のように、相互運用機能を使用して関数を記述するだけです。

[DllImport("myfakecom.dll")]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object GetFactory();

次に、マネージ コードでオブジェクトを取得したら、キャストは QueryInterface と同等です

void Foo(Object unk)
{
    IMyType mytype = (IMyType)unk;
} 

おそらく [marshalas] 属性を使用して、C++ インターフェイス定義を C# インターフェイス定義として複製する必要があります。しかし、すでにそれを行っているので、残りは簡単なはずです。

工場のプロトタイプを

IUnknown * GetFactory();

HRESULT GetFactory([out] IUnknown ** ppunk);

COM iterop コードでは、すべての COM メソッドが HRESULT を返すという強い前提があるようで、そのフローに従えば、マーシャリングを簡単に機能させることができます。

于 2010-01-29T06:25:28.750 に答える