COMインターフェイスにマーシャリング有効にするために必要なものは?

StackOverflow https://stackoverflow.com/questions/852497

質問

I、タイプライブラリせずに32ビットATL COMコンポーネントを有しています。これは、いくつかのインターフェースを実装する1つの所与のクラスのクラスファクトリを有している。

私は、インプロセスサーバーとして使用する場合、すべてが正常に動作します。

、 - クライアント側は、CoCreateInstanceを()を呼び出して、オブジェクトがインスタンス化されるとのQueryInterface()要求されたインターフェイスへのポインタを取得します。私は、COM +にコンポーネントを置くときしかし、私は、もはやクラスをインスタンス化することはできません - のCoCreateInstance()がE_NOINTERFACEを返します。

私はこの問題は、COM +が原因タイプライブラリの不在のマーシャリングを実行することができないということであると考えている - それはそれを行うにはどのようにないアイデアを持っていません。私はこれを解決するために、タイプライブラリを生成して登録する必要がありますまたは任意の他の方法はありますか?

役に立ちましたか?

解決

ユルク。私は microsoft.public.vc.atl のに尋ねる推薦します私はあなたがそこに多くの専門家を見つけることになると思うと。 (私は専門家ではないが)、私はこの問題は、登録プロキシ/スタブの問題よりもCOMの+で行うことが少ないがあると思います。 (言い換えれば、あなたはアウトプロセスコンポーネントにアクセスするには、独自のCOMクライアントを書いていても、あなたはおそらく同じ問題に遭遇するでしょう)あなたは、標準的なオートメーション互換のインタフェースを持っている場合、Windowsはちょうどあなたのオブジェクトをマーシャリングする方法を知っています細かいです。しかし、そうでない場合は、それが混同されます。

タイプライブラリがなければ、どちらかは、プロキシ/スタブを登録する必要があり、またはカスタムマーシャリング処理するためにIMarshalを自分で実装する必要があります。

(または私は理解していない、この「ハンドラマーシャリング」事もあります)

あなたはタイプライブラリ(既にマイクロソフトによって定義されたインタフェースを実装しますが、タイプライブラリを持っていないもの)を持っていない理由についてあなたのコメントは私と一緒に赤い旗を上げます。あなたはより多くの詳細を提供することができますか?それが(むしろ外部.TLBファイルより).DLLまたは.EXEで何かが、型情報ライブラリ自体の内部にあるなら、それはすべての仕事をするために適切な情報を抽出するために、おそらく可能ですが、私はちょうどに慣れていませんよ処理する。

(私はあなたが私が過去に覚えているものを知らせることができますが、私は今のツールを使用していないので、記録のために、私は、Javaのの賛成でATL / COMプログラミングを残してきたし、それは私のために難しいだろう任意のより多くのヘルプを提供するために戻ってそれらに入る。しかしmicrosoft.public.vc.atlの人々はかなりスマートですします。)

他のヒント

タイプライブラリが(IDLからgenereated)マーシャリングをサポートするための一つの方法は、プロキシ/スタブDLLの他されています。どちらの場合も、しかし、あなたは最初の場所でIDLが必要になります。

マイクロソフトでは、このインターフェイスのためにタイプライブラリ/プロキシDLLまたはIDLを提供していない場合は、

、オッズは、この理由があることがある:たぶんインターフェイスは、非marshalableデータ構造を使用して、メソッドのパラメータまたはものとして渡される関数ポインタが必要ですこのような?この場合は、DCOMのためにこのインタフェース作業をするだけの方法はありません。

たぶん、あなたはIDLを再構築することができますが、恐らく、それだけで実現可能ではありません。次に、あなたの最後のフォールバックは、カスタムまたはハンドラマーシャリングを使用するかもしれないが、それはおそらく努力する価値はありません。それは私がDCOMのために使用するように設計されていなかったDCOMのためのインターフェースを使用して関与していない他のルートを検討をお勧めしたい、と述べています。

Microsoftのデフォルトのマーシャラーを使用してmarshallableなるようにCOMインターフェイスの場合、インターフェイスは、デュアルまたはそのヘッダに定義されOLEAUTOMATION性のいずれかを有していなければならない。

インターフェースポインタで定義されたメソッドの引数がある場合は、

、同じ要件は、これらのインタフェースにも及ぶ。

プラスインターフェース名は、それを定義IDLのLIBRARYセクションに存在する必要があります。これはまた、他の参照インターフェースに延びている。

これらの条件が満たされない場合は、

、インターフェースはmarshallableではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top