2016-07-27 14 views
1

私はClasses\<CLASSNAME>\CLSID\@からレジストリ内のCOMクラスオブジェクトからCLSIDを読み取ることができます。登録されたCOMインターフェイスのIIDを取得する方法は?

登録されたCOMインターフェイスでは、Classes\<CLASSNAME>\IID\@またはClasses\CLSID\<CLSID>\IIDからIIDを読み取ることができます。

私はCOM IDs & Registry keys in a nutshellという記事を読んでいますが、この質問はまだ開いています。残念ながら、今はテストケースがありません。

答えて

4

レジストリはプログラミングリソースではありませんでした。レジストリエントリは、COMインフラストラクチャに必要なときにのみ存在します。たとえば、CLSIDキーは、COMがサーバーを実装する実行可能ファイルを見つけるのを助けるために必要です。プログラマはCLSID guidを指定する必要があります。

彼はIIDも知っている必要があり、QueryInterface()に渡してインターフェイスポインタを取得します。 はHKLM \ Software \ Classes \ Interfaceのエントリになるかもしれませんが、それほど一般的ではありません。 COMインフラストラクチャでは、あるアパートメントから別のアパートメントにインターフェイスをマーシャリングする必要がある場合、レジストリキーには、そのジョブを実行するのに役立つプロキシのCLSIDが含まれています。そのキーにあるRegedit.exeを使って簡単に調べると、まったく役に立たない可能性があることがわかります。サーバー自体には何の接続もありません。非常に幸運な場合にのみ、そこにタイプライブラリのLIBIDがあるかもしれません。

COMプログラマがCLSIDおよびIID値を提供する基本的な方法は2つあります。非友好的なやり方は.idlまたは.hファイルで、いくつかのWindowsコンポーネント(DirectX、Media Foundation、WASAPIなど)はそうです。 IIDが戻ってくるのを見るのに十分です。

フレンドリーな方法は、どのようなコンパイラでも読み方を知っている実装されたコクラスとインターフェイスの言語に依存しない記述であるタイプライブラリです。別々の.tlbまたは.olbファイルとして提供されることもありますが、通常は実行可能ファイルにリソースとして埋め込まれます。それを見ている最善の方法は、Oleview.exe SDKユーティリティです。 [ファイル]> [Typelibを表示]を使用して、.tlbまたは.dllファイルを選択します。これは、タイプライブラリをIDLに逆コンパイルします。これは、COM作成者がコンポーネントを記述するために使用する言語です。あなたはIIDを見つけるのに苦労することはありません。あなたが知っておかなければならないのは、実行可能ファイルの名前だけです。

タイプライブラリが見つかった場合は、必ずコンパイラのタイプライブラリを利用してください。生のGUIDではなくフレンドリな名前を使用できるようになりました。コードの構文チェックを行い、バージョンが変更され、作成者が新しいIIDを正しく使用することはめったにありません。あなたが見つけることができない場合は、著者に話をしてください、小さなヒントはあなたに厄介な問題を保存することができます。

+0

ありがとうございます。長い話が短いので、私はレジストリでIIDを選ぶことができません。 Btw、TypeLib GUIDが 'Classes \ CLSID \ \ TypeLib'に見つかりましたが、これは多くのクラスオブジェクトで共有されています。私はこれがあなたが指しているリビドだと思う。 – modiX

+1

あなたがLIBIDを持っているなら、あなたは金色です.HKLM \ Software \ Classes \ Typelibを見ると、タイプライブラリファイルへのパスが見つかります。 OleView.exeで選択したいもの。確かに、型ライブラリは通常、複数のコクラスを持っています。 –

+0

ありがとう、それです。私は、同じTypeLib(LIBID)とTypeLibエントリー自体との豊富なインターフェースを見つけることができました。これは多くの助けとなりました。 – modiX

関連する問題