【发布时间】:2016-07-25 14:21:47
【问题描述】:
我有以下 COM 类型:Project、ContainerItem 和 Node。
Project 有一个集合属性,该属性带有一个接受 ContainerItems 的 Append 函数。
在 C# 中,使用类型库我可以将 Node 对象发送到 Append 函数并且库按预期工作:
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 指针转换是否有特定的方法?我错过了什么?
【问题讨论】:
-
C 样式转换在 COM 接口上无效,您必须使用 QueryInterface()。 C# 自动完成,但您必须在 C++ 中自己完成。
-
Append似乎不太可能将ContainerItem**作为参数。那没有任何意义。Append的声明是什么?Node和ContainerItem之间有什么关系(如果有的话)? -
@IgorTandetnik 定义为Container::Append(ContainerItem**, long*),顺便说一下第二个参数可以为null。我不知道 Node 和 ContainerItem 之间的关系,因为它没有在编译器从 COM DLL 创建的 .tli 文件中表示。