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

Win32 BOOL 是 DWORD。您可以将 pvData 定义为ref UInt32ref 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 uint如果你应该传递一个指向 DWORD 的指针。等等。C# 编译器的方法重载解析功能可确保使用正确的 pinvoke 声明。

于 2012-12-19T15:51:55.120 回答