我是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定义应该给接口一个默认的实现,但对我来说它看起来像一个没有方法的空类......
答案 0 :(得分:5)
IDL(接口定义语言)部分以与语言无关的方式定义二进制接口,看起来很像C ++。
它通常用于构建二进制类型库,这是一个包含有关COM类信息的DLL。您可以使用Microsoft的COM / OLE Viewer浏览现有的类型库。
对于非IDispatch
COM类的C ++消耗,您不需要有关类的信息,因为C ++编译器需要知道的所有内容(最小值)都在C ++头文件中。
但是从中生成的IDL描述和类型库有助于生成使用C #和其他语言的COM类的粘合代码。我记得它还可以帮助生成通过CoCreateInstance
和朋友使用COM类所需的Windows注册表项和值。所以它是一些基础设施机制,可以说,基本上支持与语言无关的视图和COM类的使用。
干杯&第h。,