第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang:如何在沒有 cgo 的情況下調(diào)用 win32 API?

Golang:如何在沒有 cgo 的情況下調(diào)用 win32 API?

Go
茅侃侃 2021-11-22 15:57:40
我試圖GetUserNameEx從secur32.dll這樣打電話:dll, err := syscall.LoadDLL("secur32.dll")if err != nil {    log.Fatal(err)}defer dll.Release()GetUserNameEx, err := dll.FindProc("GetUserNameExW")if err != nil {    log.Fatal(err)}arr := make([]uint8, 256)var size uintGetUserNameEx.Call(3, uintptr(unsafe.Pointer(&arr[0])), uintptr(unsafe.Pointer(&size)))fmt.Println(arr)fmt.Println(size)這段代碼編譯得很好,但GetUserNameEx.Call()會失敗。我不知道為什么我不能得到UserName. 有人可以幫助我嗎?
查看完整描述

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


查看完整回答
反對 回復(fù) 2021-11-22
  • 1 回答
  • 0 關(guān)注
  • 283 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號