I have not called a Windows API from go before, so there may be other 
problems with your code. But looking at WlanEnumInterfaces documentation 
<https://msdn.microsoft.com/en-us/library/windows/desktop/ms706716(v=vs.85).aspx>
 
the last parameter is *not *a pointer to a pointer to a 
WLAN_INTERFACE_INFO_LIST, it is a pointer to a PWLAN_INTERFACE_INFO_LIST. 
So, in C terms. it is a *WLAN_INTERFACE_INFO_LIST***. In other words, you 
should be passing it a *pointer *to a uintptr, then dereferencing it twice 
to get the actual list. 

(Also, don't forget to call *WlanFreeMemory* when you are done.)

Good Luck
 - Jake

On Thursday, December 14, 2017 at 11:15:52 PM UTC-5, 流沙 wrote:
>
> API Address:https://msdn.microsoft.com/en-us/library/ms706716(VS.85).aspx
>
> Code:
>
> package main
>
> // #define WIN32_LEAN_AND_MEAN
> // #include <windows.h>
>
> import (
>    "fmt"
>    "syscall"
>    "unsafe"
>    "C"
> )
> var (
>    wlankernal,_ = syscall.LoadLibrary("Wlanapi.dll")
>    wlanhandle,_ = syscall.GetProcAddress(wlankernal,"WlanOpenHandle")
>    wlanclosehandle,_ = syscall.GetProcAddress(wlankernal,"WlanCloseHandle")
>    wlanenumInterfaces,_ = 
> syscall.GetProcAddress(wlankernal,"WlanEnumInterfaces")
>    wlangetprofile,_ = syscall.GetProcAddress(wlankernal,"WlanGetProfileList")
> )
> type ulong int32
>
> type WLAN_INTERFACE_INFO  struct{
>    InterfaceGuid syscall.GUID
>    strInterfaceDescription string
>    isState uint
> }
>
> type WLAN_INTERFACE_INFO_LIST struct {
>    NumberOfItems uint32
>    Index uint32
>    InterfaceInfo WLAN_INTERFACE_INFO
> }
>
> type WLAN_PROFILE_INFO struct{
>    ProfileName C.char
>    Flags ulong
> }
>
> type WLAN_PROFILE_INFO_LIST struct{
>    NumberOfItems ulong
>    Index ulong
>    ProfileInfo WLAN_PROFILE_INFO
> }
>
> func abort(funcname string, err error) {
>    panic(fmt.Sprintf("%s failed: %v", funcname, err))
> }
>
> //打开一个WLAN句柄
> func WlanOpenHandle() (result uint32)  {
>    negotiated_version := uint32(0)
>    client_handle := uint32(0)
>    dwClientVersion := uint32(2)
>    var nargs uintptr = 4
>    ret,_,callErr := syscall.Syscall6(uintptr(wlanhandle),
>       nargs,
>       uintptr(dwClientVersion),
>       0,
>       uintptr(unsafe.Pointer(&negotiated_version)),
>       uintptr(unsafe.Pointer(&client_handle)),
>       0,
>       0,
>    )
>    if ret != 0{
>       abort("StartWLANHandleError", callErr)
>       return
>    }
>    result = uint32(client_handle)
>    return
> }
>
> //关闭WLAN句柄
> func WlanCloseHandle()  {
>    var nargs uintptr = 2
>    handle :=WlanOpenHandle()
>    ret,_,callErr := syscall.Syscall(uintptr(wlanclosehandle),
>       nargs,
>       uintptr(handle),
>       0,
>       0,
>    )
>    if ret !=0{
>       abort("CloseHandleError",callErr)
>       return
>    }
>    fmt.Println("WlanCloseHandle Successful")
> }
>
>
> func main()  {
>    defer syscall.FreeLibrary(wlankernal)
>    var nargs uintptr = 3
>    handle :=WlanOpenHandle();
>    var wlan_interface_info WLAN_INTERFACE_INFO_LIST;
>    ret,_,callErr := syscall.Syscall(uintptr(wlanenumInterfaces),
>       nargs,
>       uintptr(handle),
>       0,
>       uintptr(unsafe.Pointer(&wlan_interface_info)),
>    )
>    if ret !=0{
>       abort("WlanEnumInterfacesError",callErr)
>       return
>    }
>    WlanCloseHandle()
>    fmt.Println(ret)
>    fmt.Println(wlan_interface_info)
> }
>
>
>
> wlan_interface_info returns a value of {7306176 0 {{0 0 0 [0 0 0 0 0 0 0 
> 0]}  0}}
> This value seems to be wrong!
> May I ask how to solve this problem?
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to