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é?
trouvé la cause du problème: le tableau doit être initialisé manuellement, car FacePosition2 n'est pas une struct. Aie. – SlavaGu