【发布时间】:2012-09-06 21:52:06
【问题描述】:
我在 C# 中有以下接口,其中一个具有相同名称(没有我)的类实现它。
[ComVisible(true)]
[Guid("B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E")]
public interface IOrder
{
long GetQuantity();
long GetOrderType();
long GetPositionType();
}
公共类 Order 的实现:IOrder 只是三个私有字段和一个需要 3 个参数的构造函数。
在其他地方,我有以下方法,其结果是我想在 C++ 非托管代码中工作,通过 COM 和 .tlb/.tlh 文件传输到那里。
public ScOrder[] GetOrders()
{
//constant return value for simplicity
return new Order[] {
new Order(1, 2, 3),
new Order(4, 5, 6)
};
}
我已经设法在使用 C# 托管代码的 C++ 非托管代码之间进行基础工作。
但是类数组被证明是一个不同的挑战......
我承认,对我而言,COM 是新的,令人困惑,C++ 早已被遗忘......,但我正在开发这两个库,所以我不会放弃;我希望 C++ DLL 在某些程序和我的 C# 代码之间充当代理。
澄清:我既没有使用 MFC,也没有使用 ATL。我在 C++ 代码中使用 #import 来获取 C# 生成的接口和类指针以及其他我不太了解的 COM 内容。
经过一个小时的研究,我只是去这里寻求帮助>.
以下是我想要实现的 C++ 代码。
//this is how the instance of C# gets created, read it from the internets
//this type has the method GetOrders
IProxyPtr iPtr;
CoInitialize(NULL);
iPtr.CreateInstance(CLSID_Proxy);
IOrderPtr* ordArr;
//IOrderPtr is just a pointer to the interface type transferred
//right? So IOrderPtr* should represent the array of those pointers, right?
SAFEARRAY* orders;
iPtr->GetOrders(&orders);
现在,我需要一些我还不明白的 COM 魔法来将 SAFEARRAY* 转换为 IOrderPtr* 或其他东西,这样我就可以遍历返回的整个数组并调用“Order”类型的方法
- GetQuantity()
- GetOrderType()
- GetPositionType()
所以对于第一个周期,我将获得值 1、2、3,对于第二个周期,我将获得值 4、5、6。
由于我同时是 C++ 和 C# 库的作者,我可以跳过所有这些 COM 疯狂的东西,并创建方法来获取集合计数和其他方法来获取特定索引上的属性值。
但这似乎不太好。我怀疑我想要的机制很简单,但我在谷歌上找到的所有答案总是缺少一些东西。
【问题讨论】:
-
我在另一个问题中解决了这个问题 - stackoverflow.com/questions/12436742/…
标签: c# c++ com safearray iunknown