2009-05-12 11 views
3

タイプライブラリのない32ビットATL COMコンポーネントがあります。クラスには、いくつかのインタフェースを実装する1つのクラスのクラスファクトリがあります。COMインターフェイスのマーシャリングを有効にするためには何が必要ですか?

インプロセスサーバーとして使用すると、クライアント側がCoCreateInstance()を呼び出し、オブジェクトがインスタンス化され、QueryInterface()が要求されたインターフェイスへのポインタを取得します。しかし、COM +にコンポーネントを置くと、クラスをインスタンス化できなくなりました.CoCreateInstance()はE_NOINTERFACEを返します。

COM +は型ライブラリがないためにマーシャリングを実行できないと考えています。これはどのように行うのかわかりません。これを解決するために型ライブラリを生成して登録する必要がありますか、それとも他の方法がありますか?

+0

ATLプロジェクトウィザードは、通常、プロジェクト出力のリソースとして埋め込まれ、コーカサスに登録されたタイプライブラリを持つように設定されています。 – Richard

+0

はい、私はそれを知っています。問題は、IDLファイルやタイプライブラリが提供されていない、すでにMicrosoftによって定義されたインタフェースを実装することです。だからこそ、私は、カスタム定義型の型ライブラリを完全に改革するのに苦労するでしょう。 – sharptooth

+0

fyiでは、COMのコンテキストで「マーシャリング」、つまりJavaのコンテキストで「整列化」しています。 :-) –

答えて

1

Urk。 microsoft.public.vc.atlにお尋ねすることをお勧めします。私は(私は専門家ではないが)問題はCOM +に登録されているプロキシ/スタブの問題よりもあまり関係がないと思う。 (言い換えれば、コンポーネントをアウトオブプロセスにアクセスするために独自のCOMクライアントを作成したとしても、おそらく同じ問題が発生します)標準のオートメーション互換インターフェイスがある場合、Windowsはオブジェクトをマーシャリングする方法を知っています良い。しかしそれ以外の場合は混乱します。

タイプライブラリがなければ、プロキシ/スタブを登録するか、カスタムマーシャリングを処理するためにIMarshalを実装する必要があります。 (または、私が理解していないこの "ハンドラーマーシャリング"のこともあります)

あなたがなぜタイプライブラリを持っていないのかについてのあなたのコメントは、既にMicrosoftによって定義されたインターフェースを実装しています。 typelib)は私と赤旗を立てます。詳細をお知らせください。それが.DLLや.EXEの中にあるものの、タイプ情報がライブラリの内部(外部の.TLBファイルではなく)にある場合は、すべての機能を実行するための正しい情報を抽出することはおそらく可能です。プロセス。

(私はATL/COMプログラミングをJavaに賛成のままにしていますので、過去に覚えていることを教えてもらえますが、今はツールを使用していません。私はそれ以上の助けを提供するために彼らに戻ってきました。しかし、microsoft.public.vc.atlの人々はかなりスマートです。)

+0

ATLのusenetグループに助けがある場合は、ここでその情報を要約してください。 – Aardvark

+0

Microsoft SDKのそれ以降のバージョンで.idlファイルが見つかりました。私はそれをプロジェクトに含めることができ、それが問題を解決するでしょう。しかし、複数のカスタムタイプがあるため、インターフェイスはオートメーションと互換性がありません。そこで、自分自身のインターフェイスを導入して、幸せにマーシャルでき、元のインターフェイスを実装したフロントエンドコンポーネントを作成し、コンポーネントにトンネリングしました。このようにしてCOM +で動作し、フロントエンド用の64ビットバージョンを作成する必要があります。内部コンポーネントが依存するすべてのものではありません。 – sharptooth

2

Typelibはマーシャリング、プロキシ/スタブDLL(IDL )は別です。しかしどちらの場合でも、まずIDLが必要です。

Microsoftがこのインターフェイス用のtypelib/proxy DLLまたはIDLを提供しない場合は、次の理由が考えられます。インターフェイスが非マーシャル可能なデータ構造を使用しているか、関数ポインタをメソッドパラメータとして渡す必要があるこのようなもの?これが当てはまる場合、このインターフェイスをDCOMで動作させる方法はありません。

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

0

Microsoftのデフォルトのマーシャラを使用してCOMインターフェイスをマーシャリング可能にするには、インターフェイスのヘッダーにDUALまたはOLEAUTOMATIONプロパティが定義されている必要があります。

定義されたメソッドの引数がインターフェイスポインタである場合、同じ要件がそれらのインターフェイスにも適用されます。

さらに、インターフェイス名は、インターフェイス名を定義するIDLのLIBRARYセクションに存在する必要があります。これはまた、他の参照されるインタフェースにも及ぶ。

これらの条件が満たされない場合、インターフェイスはマーシャリングできません。

関連する問題