c# - 将 SAFEARRAY 从 C# 传递到 COM

标签 c# .net com interop

我使用第 3 方 COM 在图片中查找面孔。其中一种方法具有来自 SDK 的以下签名:

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

Parameters: pIDibImage[in] - The image to search.

FacePositionArray[out]- The array of FacePosition2 objects into which face information is placed. This array is in a safe array (VARIANT) of type VT_UNKNOWN. The size of the array dictates the maximum number of faces for which to search.

转换为以下 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/en-gb/library/system.runtime.interopservices.marshal.aspx

关于c# - 将 SAFEARRAY 从 C# 传递到 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2863779/

相关文章:

c# - 用于创建具有合并功能的电子邮件模板的好库

c# - String.Length 在 .NET 中如何工作?

c# - 如何创建同时面向 .NET 2.0 和 .NET Standard 的库?

delphi - 在 Delphi 中使用 LateBinding 的正确方法是什么?

c# - 如何创建具有参数和私有(private)类型返回类型的快速调用委托(delegate),加速 DynamicInvoke

c# - 可能是 Visual Studio 2015 中的 C# 编译器错误

c# - 在 C# 中分段压缩文件

c# - MonoGame Windows 8 - 可写位图

c# - 将 safearray 中的 PIC N(n) 传递给 COM 对象

c++ - 直接访问 C++ ATL COM 对象