您将使用以下COM方法的互操作签名?我特别感兴趣的是最后两个参数,以及是否尝试将MarshalAs
与SizeParamIndex
一起使用。
HRESULT GetOutputSetting(
DWORD dwOutputNum,
LPCWSTR pszName,
WMT_ATTR_DATATYPE* pType,
BYTE* pValue,
WORD* pcbLength
);
文档说明:
pValue [out]指向包含该值的字节缓冲区的指针。传递NULL 检索缓冲区的长度 必需的。
pcbLength [in,out]输入时,指向包含该变量的变量的指针 pValue的长度。在输出时, 变量包含字节数 在pValue中使用。
答案 0 :(得分:2)
您可以尝试PInvoke Signature Toolkit。在执行平台互操作时正确编组是非常有用的。它很可能不会涵盖您的特定问题,但您可能会找到一个类似的问题,为您提供所需的信息。
答案 1 :(得分:1)
我会使用SizeParamIndex,因为您的场景恰好是此功能的用途:指定可变大小数组的长度。
所以参数的最后一个是C#signature:
byte[] pValue,
ref ushort pcbLength
在没有 ref 的情况下传递byte-Array,因为该数组对应于本机代码中的指针。 如果为pValue传递NULL(或在C#中为null),以便检索所需缓冲区的大小。这也意味着调用者必须分配字节数组。 参数pcbLength由 ref 传递,因为它用作输入/输出参数。