我在Managed C ++中有一个模块A,它依赖于本机C ++中的模块B,它包含在COM +中。 在模块B中,我从文件中读取字节。现在我试图从A调用文件读取功能但是失败了。
依赖关系细节:我使用了tlbimp.exe并根据模块B生成了互操作。一个引用互操作。
我试图传递一个“array ^”但只收到一个char,这是可以理解的,因为编组不知道数组长度而且无法处理整个数组。
我搜索了一些关于安全数组的建议,但无法在我的项目中成功使用它。 有人可以帮我吗?
非常感谢。
答案 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调用期间不会移动数组。如果我错了,其他人请在这里纠正我。