Go 转到系统调用窗口

Go 转到系统调用窗口,go,system-calls,Go,System Calls,我目前正在尝试在运行中使用user32.dll EnumWindows,但似乎无法正常工作 var( user32 = syscall.NewLazyDLL("user32.dll") procEnumWindows = user32.NewProc("EnumWindows") ) func EnumWindows() int { ret, _, _ := procEnumWindows.Call( syscall.NewCallback(enumWi

我目前正在尝试在运行中使用user32.dll EnumWindows,但似乎无法正常工作

var(
    user32 = syscall.NewLazyDLL("user32.dll")
    procEnumWindows = user32.NewProc("EnumWindows")
)

func EnumWindows() int {
    ret, _, _ := procEnumWindows.Call(
        syscall.NewCallback(enumWindowsProc),
        uintptr(0),
    )
    return int(ret)
}

func enumWindowsProc(hwnd syscall.Handle, lparam uintptr) bool {
    return true
}
调用EnumWindows将出现以下错误:

panic: compileCallback: output parameter size is wrong
我不知道我应该如何使用syscall包。。。我似乎找不到足够的文件


在MSDN文档页面上,它说回调应该返回BOOL,这就是我正在做的事情?

BOOL
在WinAPI中声明为
typedef int BOOL
。因此它与Go的
bool
不匹配。规格甚至没有提到它的尺寸。它可能是1个字节,但没有显示。您应该改用
int32

我认为该规范这样做是有意的:特别是为了防止滥用,例如让C代码向类型为
bool
的Go值写入内容,然后期望Go代码以“正确的方式”解释它。总之,您可以在运行时通过了解布尔值的大小。