2010-05-19 11 views
2

J'utilise COM tiers pour trouver des visages dans une image. L'une des méthodes a la signature suivante, du SDK:Passage d'un SAFEARRAY de C# à COM

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

Paramètres: pIDibImage [en] - L'image à la recherche. FacePositionArray [out] - Le tableau de Objets FacePosition2 dans lesquels figure l'information est placé. Ce tableau est dans un tableau sécurisé (VARIANT) de type VT_UNKNOWN. La taille du tableau dicte le nombre maximal de faces pour lesquelles effectuer une recherche.

qui se traduit par la signature de la méthode C# suivante (à partir des métadonnées):

int FindMultipleFaces(object pIDibImage, ref object pIFacePositions); 

Être optimiste, je l'appelle de la façon suivante, mais une exception du fait que la mémoire est corrompue. L'exception est levée uniquement lorsqu'un visage est présent dans l'image.

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

Quelle est la bonne façon de passer SAFEARRAY au code non managé?

+0

trouvé la cause du problème: le tableau doit être initialisé manuellement, car FacePosition2 n'est pas une struct. Aie. – SlavaGu

Répondre

0

Oops, il semble qu'il ne fallait me pour initialiser le tableau parce que FacePosition2 n'était pas une struct mais classe et il n'a pas été automatiquement initialisé comme je bien ça le ferait. Cette pièce était manquante:

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

Il est quelque chose comme vous initialisez un tableau en utilisant Marshal.AllocCoTaskMem puis utilisez Marshal.Copy pour le copier dans la mémoire non géré et passer un IntPtr pointant vers le tableau dans la méthode COM.

En général, regardez la Marshal classe:
http://msdn.microsoft.com/en-gb/library/system.runtime.interopservices.marshal.aspx

+0

Oups, il semble que je n'avais besoin que de moi pour initialiser le tableau car FacePosition2 n'était pas une classe struct mais elle n'était pas initialisée automatiquement comme je le pensais. FacePosition2 [] facePositions = nouveau FacePosition2 [10]; pour (var i = 0; i SlavaGu

Questions connexes