1 回答

TA貢獻1817條經驗 獲得超6個贊
…因為你不應該在那里傳遞一個指向你的內存塊的指針——引用手冊:
該緩沖區由系統分配,必須使用 NetApiBufferFree 函數釋放。
該指針的類型具有誤導性,但您應該將指針傳遞給那里的指針,如下所示:
func NetSessionEnum() {
var pinfo *SESSION_INFO_10
var prefmaxlen int32 = -1
var entriesread uint32
var totalentries uint32
var resumehandle uint32
x, y, z := procNetSessionEnum.Call(0, 0, 0, 10,
uintptr(unsafe.Pointer(&pinfo)), uintptr(prefmaxlen),
uintptr(unsafe.Pointer(&entriesread)),
uintptr(unsafe.Pointer(&totalentries)),
uintptr(unsafe.Pointer(&resumehandle)))
fmt.Println(x, y, z)
fmt.Println(entriesread, totalentries)
spew.Dump(info)
}
// Now use `*pinfo.Cname` etc
// Don't forget to later call `NetApiBufferFree()` on that pointer.
這里發生了什么:
該變量
pinfo
是一個指向類型值的指針SESSION_INFO_10
。您獲取該變量(它是一個指針)中保存的值所占用的內存塊的地址并將其傳遞給
NetSessionEnum()
.該函數自行分配緩沖區并將其地址寫入您傳遞給函數的地址所指向的內存塊。
由于您已經傳遞了
pinfo
變量的地址,因此緩沖區的地址最終會被寫入變量中pinfo
。然后,您可以使用存儲在 中的地址
pinfo
來訪問由 分配的內存NetSessionEnum()
。
這就是所謂的“雙重間接”,在 Win32 API 的很多地方都有使用。請閱讀手冊頁并研究其中包含的代碼示例。
更新:事實證明,原始代碼存在更多問題,所以我花了一些時間來提供完整的解決方案——這里是要點(在 Windows XP 32 位、Windows 2003 R2 64 上使用 Go 1.6 amd64 和 i386 進行測試)位和 Windows 8.1 64 位)。
- 1 回答
- 0 關注
- 277 瀏覽
添加回答
舉報