如何将IntPtr转换为布尔值

Dan*_*zyk 4 c# pinvoke marshalling

对于像这样编组的函数:

/*************************************************
*  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
);
Run Code Online (Sandbox Code Playgroud)

微软文档说我通过时

_WLAN_HOSTED_NETWORK_OPCODE._WLAN_HOSTED_NETWORK_OPCODE_enable
Run Code Online (Sandbox Code Playgroud)

作为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);
Run Code Online (Sandbox Code Playgroud)

但相反,我编组布尔?或者有更简单的方法吗?

感谢所有可爱的人的帮助.

Han*_*ant 7

哦,是的,有一个更简单的方法.这可以在C#中非常优雅地完成,因为它支持方法重载.C中不存在的功能因此需要PVOID参数类型.您可以简单地将参数声明为ref bool.marshaller将在调用本机函数并向其传递指针之前为BOOL创建存储.将结果转换回复制到调用后传递的bool变量中.

如果您对此函数的其他调用需要不同的数据类型,则只需重复声明.这次指定ref uint是否应该将指针传递给DWORD.等等.C#编译器的方法重载解析功能可确保使用正确的pinvoke声明.


Ale*_*x F 6

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);  // last parameter 0 (FALSE), 1 (TRUE)

/* use the IntPtr */

Marshal.FreeHGlobal(pBool);