1 回答

TA貢獻(xiàn)1155條經(jīng)驗 獲得超0個贊
size是一個輸入輸出參數(shù)。進(jìn)行調(diào)用時,必須將其設(shè)置為緩沖區(qū)的大小 ( arr)。它的類型也是PULONG,所以在 Go 中使用uint32. WindowsPULONG類型是指向 a ULONG(其范圍為 range 0..4294967295)的指針。見來源。
還Call()返回 3 個值:
func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error)
存儲返回lastErr并打印。如果你這樣做,你會更早發(fā)現(xiàn)錯誤:
_, _, lastErr := GetUserNameEx.Call(
3, uintptr(unsafe.Pointer(&arr[0])), uintptr(unsafe.Pointer(&size)))
fmt.Println(lastErr)
印刷:
More data is available.
這意味著比適合您傳遞的緩沖區(qū)的數(shù)據(jù)更多的數(shù)據(jù)可用 -或者更確切地說- 根據(jù)您使用 in-out 參數(shù)size(您0作為傳遞size)指示的大小。
工作代碼(注意除以 2 由于 unicode 和減去 1 用于'\0'大小計算的終止字節(jié)/字符):
arr := make([]uint8, 256)
var size uint32 = uint32(len(arr)) / 2 - 1
_, _, lastErr := GetUserNameEx.Call(
3, uintptr(unsafe.Pointer(&arr[0])), uintptr(unsafe.Pointer(&size)))
fmt.Println(lastErr)
fmt.Println(string(arr))
fmt.Println(arr)
fmt.Println(size)
在這種情況下lastErr將是:
The operation completed successfully.
正確處理錯誤:
返回的錯誤總是非nil,由 的結(jié)果構(gòu)造而成GetLastError。在查詢錯誤之前,調(diào)用者必須檢查主要返回值以確定是否發(fā)生錯誤(根據(jù)被調(diào)用的特定函數(shù)的語義)。錯誤將保證包含syscall.Errno.
例子:
r1, _, lastErr := GetUserNameEx.Call(
3, uintptr(unsafe.Pointer(&arr[0])), uintptr(unsafe.Pointer(&size)))
if r1 == 0 {
fmt.Println("ERROR:", lastErr.Error())
return
}
// No error, proceed to print/use arr
- 1 回答
- 0 關(guān)注
- 283 瀏覽
添加回答
舉報