.NET COM互操作方法签名

时间:2008-10-21 14:50:26

标签: c# .net com interop com-interop

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

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

文档说明:

  

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

     

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

所以参数的最后一个是C#signature:

byte[] pValue,
ref ushort pcbLength

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