繁体   English   中英

将SAFEARRAY从C#传递到COM

[英]Passing a SAFEARRAY from C# to COM

我使用第三方COM在图片中查找人脸。 其中一种方法具有来自SDK的以下签名:

long FindMultipleFaces(
  IUnknown* pIDibImage,
  VARIANTARG* FacePositionArray
);

参数:pIDibImage [in]-要搜索的图像。

FacePositionArray [out]-放置面部信息的FacePosition2对象的数组。 该数组位于VT_UNKNOWN类型的安全数组(VARIANT)中。 数组的大小决定了要搜索的面孔的最大数量。

转换为以下C#方法签名(来自元数据):

int FindMultipleFaces(object pIDibImage, ref object pIFacePositions);

乐观的是,我用以下方式称呼它,但是却发现内存已损坏。 仅当图像中有面部时才引发异常。

FacePosition2[] facePositions = new FacePosition2[10];
object positions = facePositions;
int faceCount = FaceLocator.FindMultipleFaces(dibImage, ref positions);

将SAFEARRAY传递给非托管代码的正确方法是什么?

就像您使用Marshal.AllocCoTaskMem初始化数组,然后使用Marshal.Copy将其复制到非托管内存,然后将指向该数组的IntPtr传递到COM方法中。

通常,请看Marshal课:
http://msdn.microsoft.com/zh-CN/library/system.runtime.interopservices.marshal.aspx

糟糕,似乎只需要我初始化数组即可,因为FacePosition2不是结构而是类,并且不会像我那样自动初始化。 这部分丢失了:

for (var i = 0; i < facePositions.Length; i++)
{
  facePositions[i] = new FacePosition2();
}

有更复杂的方法,但意见更正确:更改此签名Interop,因此,他看起来像在处理数组。

通过C#中的COM调用访问SafeArray结果

数组的默认封送处理

更正常见的互操作程序集问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM