“无法将SafeArray封送为此数组类型”错误

时间:2019-03-28 10:00:57

标签: com interop

我有一个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));
}

PackBytesBYTE数组转换为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中的数据段。

enter image description here

硬编码Length = 1没有帮助。删除PackByets调用使错误消失(其他字段都可以通过)。如何解决?

1 个答案:

答案 0 :(得分:0)

您引用的PackBytes方法构造的下界为1的SAFEARRAY构造为下界的下界0可以解决此问题:

SAFEARRAYBOUND bound{ count, 0 };