3

次の COM メソッドにどの相互運用署名を使用しますか? 特に最後の 2 つのパラメーターと、a を使用するかどうかに関心がありMarshalAsます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 Signature Toolkitを試すことができます。プラットフォームの相互運用を実行するときにマーシャリングを正しく行うのに役立ちます。特定の問題をカバーしていない可能性は十分にありますが、探している情報を提供する同等の問題を見つけることができます。

于 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 に答える