我正在使用Go 1.11.2在32位Windows上。
当前关于Syscall*
的文档没有给出关于第二个返回值r2
的任何意义。而且在大多数情况下,这个值似乎根本用不上。但是Go代码库内部使用了它:
go/src/runtime/syscall_windows_test.go
第103行到第118行
| m1, m2, _=VerSetConditionMask.Call(m1, m2, VER_MAJORVERSION, VER_GREATER_EQUAL) |
| m1, m2, _=VerSetConditionMask.Call(m1, m2, VER_MINORVERSION, VER_GREATER_EQUAL) |
| m1, m2, _=VerSetConditionMask.Call(m1, m2, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL) |
| m1, m2, _=VerSetConditionMask.Call(m1, m2, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL) |
| |
| vi:=OSVersionInfoEx{ |
| MajorVersion: 5, |
| MinorVersion: 1, |
| ServicePackMajor: 2, |
| ServicePackMinor: 0, |
| } |
| vi.OSVersionInfoSize=uint32(unsafe.Sizeof(vi)) |
| r, _, e2:=d.Proc("VerifyVersionInfoW").Call( |
| uintptr(unsafe.Pointer(&vi)), |
| VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR, |
| m1, m2) |
如果我理解正确的话,只有在处理使用64位值的API时才需要第二个返回值r2
。因为uintptr
是32位整数,无法容纳这些API的结果,所以使用syscall.Syscall*
作为替代。但是关于x1m5n1x的返回值没有文档说明哪个值包含了最高的32位等信息。
此外,这些API的参数在处理64位值时似乎被合并了(请参阅上面的代码)。在不知道这一点的情况下,我遇到了一个可怕的恐慌,它没有任何有意义的原因。因此,如果这些行为得到很好的文档说明会很好。
5条答案
按热度按时间cgyqldqp1#
我猜已经修复了。请检查当前文档。
monwx1rj2#
@Piyushhbhutoria 仍然没有看到关于
r2
的文档。你所说的“已经修复”是什么意思?nom7f22z3#
我该如何开始?你能解释一下如何重现你的恐慌吗,以及在哪里编辑文档?
1tu0hz3e4#
@Piyushhbhutoria 我现在没有32位的Windows机器,所以我恐怕无法向你展示导致恐慌的代码。你能尝试在32位的Windows上只传递一个
uintptr
参数给VerSetConditionMask
的第一个参数吗?ws51t4hk5#
我也没有32位的操作系统,我有一台苹果电脑。