1

我在托管 C++ 中有一个模块 A,它依赖于本机 C++ 中的模块 B,它包装为 COM plus。在模块 B 中,我从文件中读取字节。现在我正在尝试从 A 调用文件读取功能。但失败了。

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

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

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

非常感谢。

4

1 回答 1

0

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

SAFEARRAY肯定会工作,但你不必使用它。无论如何,这是一项相当多的工作。如果两个组件都不是脚本语言或 VB6,则使用SAFEARAY.

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

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

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

Marshalling 将负责传递整个数组。

你在 IDL 中声明它们如下:

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

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

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

于 2013-06-04T11:39:35.590 回答