5

そのようにマーシャリングされた関数の場合:

/*************************************************
*  DWORD WINAPI WlanHostedNetworkSetProperty(
*      _In_        HANDLE hClientHandle,
*      _In_        _WLAN_HOSTED_NETWORK_OPCODE OpCode,
*      _In_        DWORD dwDataSize,
*      _In_        PVOID pvData,
*      _Out_opt_   P_WLAN_HOSTED_NETWORK_REASON pFailReason,
*      _Reserved_  PVOID pvReserved
*  );
*************************************************/
[DllImport("Wlanapi.dll", SetLastError = true)]
public static extern UInt32 WlanHostedNetworkSetProperty(
    [In] IntPtr hClientHandle,
    [In] _WLAN_HOSTED_NETWORK_OPCODE OpCode,
    [In] UInt32 dwDataSize,
    [In] IntPtr pvData,
    [Out] out _WLAN_HOSTED_NETWORK_REASON pFailReason,
    [In, Out] IntPtr pvReserved
);

マイクロソフトのドキュメントによると、私が合格すると

_WLAN_HOSTED_NETWORK_OPCODE._WLAN_HOSTED_NETWORK_OPCODE_enable

OpCodeのパラメーターとして、pvDataの値はブール値へのポインターである必要があります。 IntPtrがブール値を指すようにする方法はわかりませんが、その関数のドキュメントは次のとおりです。構造体へのポインタをpvData として渡す場合と同様の方法で行う必要があります。


int size = Marshal.SizeOf(settings); //*settings* is a struct with some data
IntPtr pSettings = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(settings, pSettings, true);

/* use the IntPtr */

Marshal.FreeHGlobal(pSettings);

しかし、代わりに私はブール値をマーシャリングしますか?または、もっと簡単な方法はありますか?

すべての素敵な人々の助けをありがとう。

4

2 に答える 2

7

Win32BOOLはDWORDです。ref UInt32この場合、またはこの場合にpvDataを定義できますref Int32。または、pvDataをIntPtrのままにし、アンマネージメモリをで割り当てMarshal.AllocHGLobal(Marshal.SizeOf(Int32))、このメモリを。で埋めますMarshal.WriteInt32

int size = Marshal.SizeOf(Int32);
IntPtr pBool = Marshal.AllocHGlobal(size);
Marshal.WriteInt32(pBool、0、1); //最後のパラメータ0(FALSE)、1(TRUE)

/*IntPtrを使用します*/

Marshal.FreeHGlobal(pBool);
于 2012-12-19T14:44:38.857 に答える
7

そうそう、もっと簡単な方法があります。メソッドのオーバーロードがサポートされているため、これは C# で非常にエレガントに実行できます。C には存在しないため、PVOID 引数型が必要な機能。引数を として宣言するだけですref bool。マーシャラーは、ネイティブ関数を呼び出す前に BOOL のストレージを作成し、それにポインターを渡します。結果を変換して、呼び出し後に渡す bool 変数にコピーします。

別のデータ型を必要とするこの関数の追加の呼び出しがある場合は、宣言を繰り返してください。今回は、たとえば、ref uintDWORD へのポインターを渡す必要があるかどうかを指定します。など。C# コンパイラのメソッド オーバーロード解決機能により、正しい pinvoke 宣言が使用されます。

于 2012-12-19T15:51:55.120 に答える