3

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

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

文档指出:

pValue [out] 指向包含该值的字节缓冲区的指针。传递 NULL 以检索所需缓冲区的长度。

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

4

2 回答 2

2

您可以尝试PInvoke 签名工具包。在执行平台互操作时正确编组非常有用。它很可能不会涵盖您的特定问题,但您可能会找到一个类似的问题来为您提供所需的信息。

于 2008-10-21T14:51:47.710 回答
1

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

所以最后一个参数将在 C# 签名中:

byte[] pValue,
ref ushort pcbLength

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

于 2008-10-21T15:17:45.693 回答