c# - 如何将 IntPtr 获取为 bool 值

标签 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
);

Microsoft 文档说当我通过时

_WLAN_HOSTED_NETWORK_OPCODE._WLAN_HOSTED_NETWORK_OPCODE_enable

作为OpCode的参数,pvData的值应该是一个指向 bool 值的指针。
Hereis the documentation for that function
我不知道如何让 IntPtr 指向 bool 值?
是否应该以与我将指针作为 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);

但我反而编码了 bool 值?或者有更简单的方法吗?

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

最佳答案

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);

关于c# - 如何将 IntPtr 获取为 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954614/

相关文章:

C# Native Interop - 为什么大多数库使用 LoadLibrary 和委托(delegate)而不是 SetDllDirectory 和简单的 DllImport

android - 应用程序被杀死时的 GCM 推送通知 Android Pre lollipop

java - 从 xpath 中查找包含标签作为 Java 子元素的字符串

c# - 使用嵌套命令时是否可以避免 open DataReader 异常?

c# - 移动 UWP InkStrokes 以进行离屏渲染

c# - 从磁盘号检索虚拟磁盘文件名

c# - 此 C++ 代码的 C# 等价物是什么(带有 InPtr)

c# - 如何以编程方式按多列对 UltraGrid 进行排序?

c# - 在 C# 中使用 ProtonMail 发送电子邮件

c# - PInvoke - 找不到指定的模块。如何检查缺少的依赖项?