.NET COM 互操作方法签名

本文关键字:操作方法 COM NET | 更新日期: 2023-09-27 17:47:21

您将为以下 COM 方法使用什么互操作签名?我对最后两个参数特别感兴趣,以及是否尝试将MarshalAsSizeParamIndex一起使用。

HRESULT GetOutputSetting(
  DWORD    dwOutputNum,
  LPCWSTR  pszName,
  WMT_ATTR_DATATYPE*  pType,
  BYTE*    pValue,
  WORD*    pcbLength
);

文档指出:

pValue [out] 指向包含该值的字节缓冲区的指针。传递空 检索缓冲区的长度 必填。

pcbLength [in, out] 在输入时,指针指向包含 p值的长度。在输出时, 变量包含字节数 在使用的 p 值中。

.NET COM 互操作方法签名

您可以尝试 PInvoke Signature Toolkit。这对于在执行平台互操作时正确封送非常有用。它很可能不会涵盖您的特定问题,但您可能会找到一个类似的问题,为您提供所需的信息。

我会使用 SizeParamIndex,因为您的场景正是此功能所针对的场景: 指定可变大小数组的长度。

因此,最后一个参数将是 C# 签名:

byte[] pValue,
ref ushort pcbLength

byte-Array 的传递不带 ref,因为数组对应于本机代码中的指针。如果为 pValue 传递 NULL(或 C# 中的 null)以检索所需缓冲区的大小。这也意味着调用方必须分配字节数组。参数 pcbLength 由 ref 传递,因为它用作输入/输出参数。