【问题标题】:Windows WlanApi and Python CtypesWindows WlanApi 和 Python Ctypes
【发布时间】:2011-11-07 23:02:10
【问题描述】:

我正在 Windows 上开发一个强制门户项目。我写过这段代码(类似于this):

from ctypes import wintypes
import ctypes

WlanApi = ctypes.windll.wlanapi

hClientHandle = wintypes.HANDLE()
phClientHandle = ctypes.pointer(hClientHandle)
dwNegotiatedVersion = wintypes.DWORD()
pdwNegotiatedVersion = ctypes.pointer(dwNegotiatedVersion)
dwClientVersion = wintypes.DWORD()
dwClientVersion.value = 2L

rc = WlanApi.WlanOpenHandle(dwClientVersion, None, pdwNegotiatedVersion, phClientHandle)
print rc

class GUID(ctypes.Structure):
    _fields_ = [("Data1", wintypes.DWORD),
                ("Data2", wintypes.WORD),
                ("Data3", wintypes.WORD),
                ("Data4", wintypes.BYTE * 8)]

class WLAN_INTERFACE_INFO (ctypes.Structure):
    _fields_ = [('InterfaceGuid', GUID),
                ('strInterfaceDescription', wintypes.WCHAR * 256),
                ('isState', wintypes.????)]

class WLAN_INTERFACE_INFO_LIST(ctypes.Structure):
    _fields_ = [('dwNumberOfItems', wintypes.DWORD),
                ('dwIndex', wintypes.DWORD),
                ('InterfaceInfo', WLAN_INTERFACE_INFO * 10)]

IfList = WLAN_INTERFACE_INFO_LIST()
pIfList = ctypes.pointer(IfList)
rc = WlanApi.WlanEnumInterfaces(hClientHandle, None, pIfList)

print rc
print "Num Entries: %s" % IfList.dwNumberOfItems

我找不到如何构造“WLAN_INTERFACE_STATE enumeration”,当我尝试使用WCHAR 数组或其他任何东西时,此脚本返回我的 6000000 个无线接口!!!

有人可以帮帮我吗?

【问题讨论】:

  • 如果我用字节数组替换 dwNumberOfItems,我的脚本会返回:\nNum Entries: -32 76 80 00 00 00 00 00\n第二次运行我得到\nNum Entries: -32 76 60 00 00 00 00 00\n\n可能问题出在 HANDLE 指针上?

标签: python windows wifi ctypes


【解决方案1】:

它只是一个整数,没有结构 0 = 未准备好,1 = 已连接等。

【讨论】:

    【解决方案2】:

    嗯,它开始变得有意义了,因为这些结构中的大多数都有一个相应的指针。

    据 PInvoke 的男孩们说

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct WLAN_INTERFACE_INFO
    {
      /// GUID->_GUID
      public Guid InterfaceGuid;
      /// WCHAR[256]
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
      public string strInterfaceDescription;
      /// WLAN_INTERFACE_STATE->_WLAN_INTERFACE_STATE
      public WLAN_INTERFACE_STATE isState;
    }
    

    WLAN_INTERFACE_STATE 在哪里

    public enum WLAN_INTERFACE_STATE
    {
      wlan_interface_state_not_ready = 0,
      ...
      // 1 to 6
      ...
      wlan_interface_state_authenticating = 7,
    }
    

    PInvoke on WLAN...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多