gpt4 book ai didi

c++ - 如何定义 COM coclass 的实现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:48 24 4
gpt4 key购买 nike

我是 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++ 类,编译器是否会将我的类与接口(interface)正确链接? 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 定义应该为接口(interface)提供默认实现,但对我来说它看起来像一个没有方法的空类......

最佳答案

IDL(接口(interface)定义语言)部分以独立于语言的方式定义二进制接口(interface),看起来很像 C++。

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

对于非 IDispatch COM 类的 C++ 消费,您不需要关于您的类的信息,因为 C++ 编译器需要知道的(至少)都在您的 C++ 头文件中.

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

干杯,

关于c++ - 如何定义 COM coclass 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6509032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com