我有一个C ++ COM本地服务器和C#客户端。服务器代码:
// MyStruct as define in the _i.h file
typedef /* [uuid] */ DECLSPEC_UUID("...") struct MyStruct
{
SAFEARRAY * FormatData;
LONG aLong;
BOOL aBool;
} MyStruct;
// Server method being invoked
STDMETHODIMP CMyClass::Foo(MyStruct* StreamInfo, int* result)
{
long Length;
BYTE* Data;
GetData(Length, Data);
PackBytes(Length, Data, &(StreamInfo->FormatData));
}
PackBytes
将BYTE
数组转换为SAFEARRAY
。它取自this stackoverflow question。它设置SAFEARRAY
的边界和尺寸。
客户端代码:
MyStruct myStruct;
int rc = obj.Foo(out myStruct);
从COM程序集中导入MyStruct
的位置。它显示为
public struct MyStruct
{
public Array FormatData;
int aLong;
int aBool;
}
运行Foo
后出现错误“ SafeArray无法编组为该数组类型,因为它的下界非零或不止一个维”,并带有附加备注“确保您的数组具有所需的维度数”
在调试服务器代码时,Data
中似乎已正确填充了FormatData
:如下面的屏幕截图所示。 cElements
等于Length
,并且18个数据段等于Data
中的数据段。
硬编码Length = 1
没有帮助。删除PackByets
调用使错误消失(其他字段都可以通过)。如何解决?
答案 0 :(得分:0)
您引用的PackBytes
方法构造的下界为1的SAFEARRAY
构造为下界的下界0可以解决此问题:
SAFEARRAYBOUND bound{ count, 0 };