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])) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Windows中的直接磁盘访问(C#)
- windows-server-2008 – 如何设置BIND DNS服务器以响应Wind
- windows-8 – 在后台任务中访问Javascript Metro应用程序的
- 如何有效克服“u_int8_t vs uint8_t”问题
- 如何使用PowerShell获取键内注册表值的数据值
- WIN2000?SERVER安全配置服务器手册?(4)
- 适用于Windows和Mac的CD上的自动播放HTML
- 使程序开机自启
- windows – 用于构建qt的clang的mkspecs是什么?
- Windows Phone 7 – Windows Phone 7应用程序是否兼容Windo
推荐文章
站长推荐
热点阅读