2015-12-19 9 views
0

Im в настоящее время пытаются использовать USER32.dll EnumWindows на Go, но, кажется, не работаетGo окна системный вызов вызов

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, и это то, что я делаю?

ответ

2

BOOL в WinAPI объявлен как typedef int BOOL. Так что он не соответствует Go's bool. В спецификациях даже не упоминается, какой размер у него есть. Это, наверное, 1 байт, но он этого не говорит. Вместо этого вы должны использовать int32.

+0

Я думаю, что спецификация делает это специально: специально для предотвращения злоупотреблений, например, для того, чтобы код C записывал что-то в значение Go типа 'bool', а затем ожидал, что код Go будет интерпретировать его« правильным способом ». В целом вы можете узнать размер логического значения во время выполнения через ['unsafe.Sizeof()'] (https://golang.org/pkg/unsafe/#Sizeof). – kostix

Смежные вопросы