【问题标题】:Go syscall call windowsGo 系统调用调用窗口
【发布时间】:2016-03-26 03:57:53
【问题描述】:

我目前正在尝试在 Go 上使用 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,这就是我在做什么?

【问题讨论】:

    标签: go system-calls


    【解决方案1】:

    WinAPI 中的BOOL 声明为typedef int BOOL。所以它与 Go 的 bool 不匹配。规格甚至没有提到它的尺寸。它可能是 1 个字节,但它没有说出来。你应该改用int32

    【讨论】:

    • 我认为规范是故意这样做的:特别是为了防止滥用,例如让 C 代码将某些内容写入类型为 bool 的 Go 值,然后期望 Go 代码以“正确的方式”解释它”。总而言之,您可以在运行时通过unsafe.Sizeof() 了解布尔值的大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多