Я использую сторонний COM, чтобы найти лица на картинке. Один из методов имеет следующую сигнатуру из SDK:
long FindMultipleFaces(
IUnknown* pIDibImage,
VARIANTARG* FacePositionArray
);
Параметры: pIDibImage [in] - Изображение
искать.
FacePositionArray [out] - Массив
FacePosition2 объекты, в которые лицо
информация размещена. Этот массив
в безопасном массиве (VARIANT) типа
VT_UNKNOWN. Размер массива
диктует максимальное количество лиц
для которого искать.
, что переводится в следующую сигнатуру метода C # (из метаданных):
int FindMultipleFaces(object pIDibImage, ref object pIFacePositions);
Будучи оптимистом, я называю это следующим образом, но получаю исключение, что память повреждена. Исключение выдается, только если на изображении присутствует лицо.
FacePosition2[] facePositions = new FacePosition2[10];
object positions = facePositions;
int faceCount = FaceLocator.FindMultipleFaces(dibImage, ref positions);
Как правильно передать SAFEARRAY в неуправляемый код?