Ich versuche WinHttpGetIEProxyConfigForCurrentUser
Funktion aufrufen, um die automatisch erkannt IE Proxy-Einstellungen zu erhalten. Es akzeptiert einen inout-struct-Parameter gemäß documentation. Ich verwende folgenden Code:Golang: Winapi Aufruf mit Strukturparameter
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, 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
}
Es sieht aus wie der Aufruf erfolgreich ist, settings
nicht gleich Null ist, aber sobald ich es greife ich Panik bekommen. Hier ist die Ausgabe:
1 The operation completed successfully.
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x1 pc=0x4d2bb4]
A Go-String ist nicht das gleiche wie ein C-String, und in diesem Fall die Dokumentation aussehen die Felder breiten Zeichen sein sollen (?), So werden diese sollten wahrscheinlich '* uint16' statt String . Sie übergeben auch einen Zeiger auf einen Zeiger auf den Syscall, der nur einen einzelnen Zeiger erfordert. loswerden der zusätzlichen '&' in den Argumenten. – JimB
Danke für den Tipp. Wie konvertiere ich den '* uint16' in einen Go-String? Ich habe 'UTF16PtrFromString' gefunden, das die umgekehrte Umwandlung macht, aber nichts, um zurück zu konvertieren. – rosencreuz