如何从COM plus项目接收Managed C ++项目中的字节

时间:2013-06-04 10:45:42

标签: com com-interop

我在Managed C ++中有一个模块A,它依赖于本机C ++中的模块B,它包含在COM +中。 在模块B中,我从文件中读取字节。现在我试图从A调用文件读取功能但是失败了。

依赖关系细节:我使用了tlbimp.exe并根据模块B生成了互操作。一个引用互操作。

我试图传递一个“array ^”但只收到一个char,这是可以理解的,因为编组不知道数组长度而且无法处理整个数组。

我搜索了一些关于安全数组的建议,但无法在我的项目中成功使用它。 有人可以帮我吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果您要通过COM与您的本机对象进行通信,那么您将不得不以COM方式传递数组。

SAFEARRAY肯定会奏效,但你不必使用它。无论如何,设置还是相当多的工作。如果两个组件都不是脚本语言或VB6,那么使用SAFEARAY几乎没有价值。

COM可以很好地编组阵列,你只需告诉它有多大。 COM中传递(本机)数组的两种最常见机制是“固定大小的数组”和“符合数组”。

如果你在编译时知道数组的大小,这就是你要走的路。在IDL中声明您的COM方法如下:

...
const long ARRAY_SIZE = 1024;
...
HRESULTS MethodAbc(MyClass array[ARRAY_SIZE]);

编组将负责传递整个阵列。

您在IDL中声明如下:

HRESULT MethodAbc([size_is(arraySize)] MyClass array[], long arraySize);

这告诉COM,arraySize参数保存元素的数量。

我使用CLI的经验很少,但我认为您不能只传递CLI句柄。除此之外,我相信您需要固定指针,以便GC在COM调用期间不会移动数组。如果我错了,其他人请在这里纠正我。