栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang:如何在没有cgo的情况下调用win32 API?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang:如何在没有cgo的情况下调用win32 API?

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452366.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号