加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – golang:使用struct参数调用winapi

发布时间:2020-12-14 02:01:49 所属栏目:Windows 来源:网络整理
导读:我正在尝试调用WinHttpGetIEProxyConfigForCurrentUser函数来获取自动检测到的IE代理设置.它根据 documentation接受inout结构参数.我使用以下代码: func GetProxySettings() { winhttp,_ := syscall.LoadLibrary("winhttp.dll") getIEProxy,_ := syscall.Ge
我正在尝试调用WinHttpGetIEProxyConfigForCurrentUser函数来获取自动检测到的IE代理设置.它根据 documentation接受inout结构参数.我使用以下代码:

func GetProxySettings() {
    winhttp,_ := syscall.LoadLibrary("winhttp.dll")
    getIEProxy,_ := syscall.GetProcAddress(winhttp,"WinHttpGetIEProxyConfigForCurrentUser")

    settings := new(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG)
    var nargs uintptr = 1

    ret,_,callErr := syscall.Syscall(uintptr(getIEProxy),nargs,uintptr(unsafe.Pointer(&settings)),0)
    fmt.Println(ret,callErr)
    if settings != nil {
        fmt.Println(settings.fAutoDetect)
        fmt.Println(settings.lpszAutoConfigUrl)
        fmt.Println(settings.lpszProxy)
        fmt.Println(settings.lpszProxyBypass)
    }
}

type WINHTTP_CURRENT_USER_IE_PROXY_CONFIG struct {
    fAutoDetect       bool
    lpszAutoConfigUrl string
    lpszProxy         string
    lpszProxyBypass   string
}

看起来呼叫成功,设置不是零,但一旦我访问它我就会感到恐慌.这是输出:

1 The operation completed successfully.
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x1 pc=0x4d2bb4]

解决方法

您需要将指针传递给已使用新函数创建的已分配结构.删除额外的&来自系统调用; uintptr(unsafe.Pointer(设置))

您还需要一个与syscall所期望的C结构具有相同布局的结构.结构定义如下:

typedef struct {
  BOOL   fAutoDetect;
  LPWSTR lpszAutoConfigUrl;
  LPWSTR lpszProxy;
  LPWSTR lpszProxyBypass;
} WINHTTP_CURRENT_USER_IE_PROXY_CONFIG;

哪个应该翻译成

type WINHTTP_CURRENT_USER_IE_PROXY_CONFIG struct {
    fAutoDetect       bool
    lpszAutoConfigUrl *uint16
    lpszProxy         *uint16
    lpszProxyBypass   *uint16
}

每个LPWSTR字段都将是一个以null结尾的16位/字符串字符串.为了将它们转换为Go字符串,首先需要将* uint16转换为[] uint16切片,然后将该切片解码为utf8字符串.

// Convert a *uint16 C string to a Go String
func GoWString(s *uint16) string {
    if s == nil {
        return ""
    }

    p := (*[1<<30 - 1]uint16)(unsafe.Pointer(s))

    // find the string length
    sz := 0
    for p[sz] != 0 {
        sz++
    }

    return string(utf16.Decode(p[:sz:sz]))
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读