我在 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”类型的方法
- 获取数量()
- 获取订单类型()
- 获取位置类型()
因此,对于第一个周期,我将获得值 1、2、3,对于第二个周期,我将获得值 4、5、6。
因为我是 C++ 和 C# 库的作者,所以我可以跳过所有这些 COM 疯狂的东西,并制作方法来获取集合计数和其他方法来获取特定索引上的属性值。
但这似乎并不好。我怀疑我想要的机制很简单,但我在谷歌上找到的所有答案总是缺少一些东西。