在C++中铸造COM类型
Casting COM types in C++
我有以下COM类型:Project
、ContainerItem
和Node
。Project
具有带有Append
函数的集合属性,该函数接受ContainerItem
s。
在C#中,使用类型库,我可以向Append
函数发送一个Node
对象,并且库按预期工作:
var prj = new Project();
var node = new Node();
prj.collection.Append(node);
在C++中,我尝试了一个直接的指针强制转换,期望这就是C#所做的,但最终出现了一个错误:
ProjectPtr prj;
prj.CreateInstance(__uuidof(Project));
NodePtr node;
node.CreateInstance(__uuidof(Node));
prj->collection->Append((ContainerItem**)&node.GetInterfacePtr());
在C++中,有没有一种特定的方法来处理这些类型的COM指针类型转换?我错过了什么?
COM强制转换是使用QueryInterface()
方法完成的。查询对象是否支持接口(基于GUID),如果支持接口,则会增加内部引用计数器(请参阅AddRef()
),并返回指向接口的指针。MSDN提供了更多关于内部工作的详细信息。
C++不像C#那样直接支持"COM强制转换"的代码生成,但它的实现足够简单。
struct bad_com_cast : std::runtime_error {
bad_com_cast() : std::runtime_error("COM interface not supported") {}
};
template <class To, class From>
To* qi_cast(From* iunknown)
{
HRESULT hr = S_OK;
To* ptr = NULL;
if (iunknown) {
hr = iunknown->QueryInterface(__uuidof(To), (void**)(&ptr));
if (hr != S_OK) {
throw bad_com_cast(); // or return NULL
}
}
return ptr;
}
使用上面的"cast",可以按如下方式实现示例;
ContainerItem* ci = qi_cast<ContainerItem>(node);
prj->collection->Append(&ci);
如果正在使用ATL库,则可以直接使用ATL::CComQIPtr<>
来获得等效语义;
auto ci = CComQIPtr<ContainerItem>(node);
if (ci) {
// ...
}
就像@HansPassant评论的那样,我不得不使用QueryInterface函数:
ContainerItem* ci = nullptr;
node.QueryInterface(__uuidof(ContainerItem), ci);
prj->collection->Append(&ci);
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 如何在 COM 中对方法执行返回类型
- 在 C# 中加载 COM 对象会引发异常"无法将类型'System.__ComObject'的 COM 对象强制转换为接口类型...",但C++或 VB 不会
- 复杂C++数据类型和 COM
- 如何通过COM公开可为null的类型
- COM:如何在idl中指定特定类型的COM对象作为参数
- c\c++ 中存储 COM VT_DECIMAL的正确类型是什么?
- 如何在基于api的服务器中正确转换和使用本机COM类型
- 如何将 C# 接口的方法参数公开为特定的 COM/ODL 类型?
- 在C++中铸造COM类型
- 通过COM返回自定义接口类型的SAFEARRAY到VB6
- 你认为是什么让这个C++代码变慢了?(它循环通过ADODB记录集,将COM类型转换为字符串,并填充ostringstre