size是输入输出参数。进行呼叫时,必须将其设置为缓冲区(
arr)的大小。它的类型也是
PULONG,所以在Go中使用
uint32。Windows
PULONG类型是指向的指针
ULONG(具有
0..4294967295)。参见来源。
还
Call()返回3个值:
func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error)
存储返回
lastErr并打印。完成此操作后,您会更早发现错误:
_, _, lastErr := GetUserNameEx.Call( 3, uintptr(unsafe.Pointer(&arr[0])), uintptr(unsafe.Pointer(&size)))fmt.Println(lastErr)
印刷品:
More data is available.
这意味着更多的数据比什么适合入缓冲区您传递可用- 或者更确切地说 -您用IN-OUT参数指示的大小
size(你通过
0的
size)。
工作代码(请注意,由于unipre除以2,除以1表示终止
' '字节/字符,用于大小计算):
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,由的结果构成GetLastError。调用者必须在查询错误之前检查主返回值,以确定是否发生错误(根据所调用的特定函数的语义)。该错误将被保证包含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


