0

我正在尝试将从 ac# 库导出的结构数组传递给 c++ 代码。目标是将结构的 SAFEARRAY 从 c++ 传递到 c#。

我已按照指示

http://limbioliong.wordpress.com/2011/07/16/marshaling-a-safearray-of-managed-structures-by-com-interop-part-2/

但是通过调用 GetRecordInfoFromTypeInfo 得到这个错误

0x80028019 旧格式或无效类型库。

4

2 回答 2

1

如果您不需要调度接口,以下应该可以工作:

void MyMethod([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] MyStruct[] data, long size);

如果您需要使用 SAFEARRAY,我希望以下工作(但我不是 100% 确定,因为我目前没有可用的 Windows 机器):

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_USERDEFINED)] MyStruct[] data);

如果您负担得起更改您的费用structclass那么这也将起作用,并让您免于 UDT 的麻烦:

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)] MyStruct[] data);
于 2012-09-21T20:01:09.057 回答
1

结构是否包含字符串?如果是这样,请确保标记它们 [MarshalAs(UnmanagedType.BStr)]。COM 中有一个限制:结构数组中的字符串必须是 BSTR。TLBExp 默认为 LPWSTR,然后调用终止。见这里: http: //msdn.microsoft.com/en-us/library/z6cfh6e6 (v=vs.100).aspx

于 2012-10-16T22:09:00.263 回答