如何定义COM coclass的实现?

Car*_*arl 5 c++ com coclass

我是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;
  };
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,你在哪里定义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:
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我将库部分放在.idl文件中,或者如果我没有,则编译它.我有点失落,因为这里有什么好处?我知道coclass定义应该给接口一个默认的实现,但对我来说它看起来像一个没有方法的空类......

Che*_*Alf 5

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

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

对于非IDispatchCOM类的C++消耗,您不需要有关类的信息,因为C++编译器需要知道的所有内容(最低限度)都在C++头文件中.

但是从中生成的IDL描述和类型库有助于生成使用C #和其他语言的COM类的粘合代码.我记得它也可以帮助生成通过CoCreateInstance和朋友使用COM类所需的Windows注册表项和值.所以它是一些基础设施机制,可以说,基本上支持与语言无关的视图和COM类的使用.

干杯&hth.,

  • @Carl:即使在 COM 中也没有魔法。实例化 COM 对象的常用方法是调用 CoCreateInstance,给它一个类的 128 位 CLSID(这是一个 UUID),*和*一个接口的 128 位 IID(这是一个 UUID),类必须提供。它在注册表中查找该 CLSID,从而为其提供服务器、DLL 或 EXE。然后它向该服务器请求一个实例。它向实例询问接口。我对实例化如何在 EXE 服务器上工作有点含糊,这就是你的情况。但是,对于 DLL,它是由 DLL 提供的简单对象工厂(众所周知的函数)。干杯, (2认同)