2010-05-19 86 views
2

我使用第三方COM来查找图片中的人脸。其中一种方法具有以下特征,从SDK:将C#中的SAFEARRAY传递给COM

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

参数:pIDibImage [中] - 图像 进行搜索。

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传递给非托管代码的正确方法?

+0

发现问题的原因:所述阵列必须手动初始化,因为FacePosition2不是一个结构。哎哟。 – SlavaGu 2010-05-19 08:53:42

回答

0

哎呀,现在看来,这只是从我需要初始化数组,因为FacePosition2不是一个结构,但类,它是不会自动为我虽然初始化它会。这件作品是丢失:

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

这件事情,就像你使用Marshal.AllocCoTaskMem然后用Marshal.Copy将其复制到非托管内存和传递一个IntPtr指向数组的COM方法初始化数组。

一般来说,看Marshal类:
http://msdn.microsoft.com/en-gb/library/system.runtime.interopservices.marshal.aspx

+0

糟糕,它似乎只需要从我初始化数组,因为FacePosition2不是一个结构,但类,它不是自动初始化,因为我会尽可能。 FacePosition2 [] facePositions = new FacePosition2 [10]; (var i = 0; i SlavaGu 2010-05-19 08:47:21

相关问题