[英]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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.