.NET COM 互操作方法签名
本文关键字:操作方法 COM NET | 更新日期: 2023-09-27 17:47:21
您将为以下 COM 方法使用什么互操作签名?我对最后两个参数特别感兴趣,以及是否尝试将MarshalAs
与SizeParamIndex
一起使用。
HRESULT GetOutputSetting(
DWORD dwOutputNum,
LPCWSTR pszName,
WMT_ATTR_DATATYPE* pType,
BYTE* pValue,
WORD* pcbLength
);
文档指出:
pValue [out] 指向包含该值的字节缓冲区的指针。传递空 检索缓冲区的长度 必填。
pcbLength [in, out] 在输入时,指针指向包含 p值的长度。在输出时, 变量包含字节数 在使用的 p 值中。
您可以尝试 PInvoke Signature Toolkit。这对于在执行平台互操作时正确封送非常有用。它很可能不会涵盖您的特定问题,但您可能会找到一个类似的问题,为您提供所需的信息。
我会使用 SizeParamIndex,因为您的场景正是此功能所针对的场景: 指定可变大小数组的长度。
因此,最后一个参数将是 C# 签名:
byte[] pValue,
ref ushort pcbLength
byte-Array 的传递不带 ref,因为数组对应于本机代码中的指针。如果为 pValue 传递 NULL(或 C# 中的 null)以检索所需缓冲区的大小。这也意味着调用方必须分配字节数组。参数 pcbLength 由 ref 传递,因为它用作输入/输出参数。