6

私は COM を初めて使用します。インターネットで調べて、C++ で COM クラスを作成する方法を見つけました (C# で使用するため)。.idl ファイルに、次のようなものを配置する必要があることがわかりました。

[
object,
uuid(a93164ee-e6d4-44be-aa27-f00ce6972719),
helpstring("interface ITopologyQuery")
]

interface ITopologyQuery : IUnknown
{
  HRESULT LoadFile(BSTR completeFileName);

  HRESULT SetParameters(int above, int percentage);
}

[
  uuid(a958f2af-8b55-43c4-9fc3-c39d83fc1376)
]
library TopologyQueryLib
{
  [
    uuid(cc814992-31ec-4a1f-a41e-111ade27bdfe),
    helpstring("TopologyQuery class")
  ]
  coclass CTopologyQuery
  {
    [default] interface ITopologyQuery;
  };
}

私の質問は、CTopologyQuery クラスをどこで定義するかということです。別のファイルで通常の C++ クラスとして定義した場合、コンパイラはクラスをインターフェイスに正しくリンクしますか? C++ クラス コードは次のようになります (.cpp ファイルに実装されています)。

class CTopologyQuery : public ITopologyQuery
{
  public:

    __stdcall CTopologyQuery();

    //IUnknown interface 
    HRESULT __stdcall QueryInterface(REFIID riid, void **ppObj);
    ULONG   __stdcall AddRef();
    ULONG   __stdcall Release();

    //ITopologyQuery interface
    HRESULT __stdcall LoadTopologyFile(BSTR completeFileName);
    HRESULT __stdcall SetParameters(int above, int percentage);

  private:
};

今のところ、ライブラリ セクションを .idl ファイルに入れても、入れなくてもコンパイルされます。ここで何をするのが良いのか、少し迷っています。コクラス定義がインターフェイスにデフォルトの実装を与えることになっていることは理解していますが、私にとってはメソッドのない空のクラスのように見えます...

4

1 に答える 1

6

IDL (Interface Definition Language) 部分は、C++ によく似た言語に依存しない方法でバイナリ インターフェイスを定義します。

これは通常、COM クラスに関する情報を含む DLL であるバイナリタイプ ライブラリを構築するために使用されます。Microsoft の COM/OLE Viewer を使用して、既存のタイプ ライブラリを参照できます。

IDispatchCOM クラスを C++ で使用する場合、C++ コンパイラが (最低限) 知る必要があるのは C++ ヘッダー ファイルにあるため、クラスに関するその情報は必要ありません。

しかし、そこから生成された IDL 記述とタイプ ライブラリは、C #やその他の言語から COM クラスを使用するためのグルー コードを生成するのに役立ちます。私が思い出したように、COM クラスを経由して使用するために必要な Windows レジストリ キーと値を生成するのにも役立ちますCoCreateInstance。つまり、いわばインフラストラクチャ機構のようなものであり、基本的に言語に依存しないビューと COM クラスの使用法をサポートしています。

乾杯 & hth.,

于 2011-06-28T16:01:34.500 に答える