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 文件中,或者不这样做,它都会编译。我有点失落,因为这里有什么好处?我知道 coclass 定义应该为接口提供默认实现,但对我来说它看起来像一个没有方法的空类......

4

1 回答 1

6

IDL(接口定义语言)部分以一种与语言无关的方式定义二进制接口,看起来很像 C++。

它通常用于构建二进制类型库,这是一个包含有关您的 COM 类信息的 DLL。您可以使用 Microsoft 的 COM/OLE 查看器来浏览现有的类型库。

对于非IDispatchCOM 类的 C++ 使用,您不需要有关您的类的信息,因为 C++ 编译器需要知道的所有信息(至少)都在您的 C++ 头文件中。

但是从中生成的 IDL 描述和类型库有助于生成胶水代码,以便从 C #和其他语言中使用您的 COM 类。我记得它还可以帮助生成通过CoCreateInstance和朋友使用您的 COM 类所需的 Windows 注册表项和值。所以它是一种基础结构机器,可以说,本质上支持独立于语言的视图和 COM 类的使用。

干杯&hth.,

于 2011-06-28T16:01:34.500 回答