参考《Golang与DLL交互》,实现过程中出现了3个问题
1、32位和64位的错误
执行 go run main.go出现下面的错误:
syscall.(*LazyProc).mustFind(0xc04206c240)
C:/tools/go/src/syscall/dll_windows.go:280 +0x5f
syscall.(*LazyProc).Call(0xc04206c240, 0xc0420100c0, 0x1, 0x1, 0x0, 0x9, 0xc04205c308, 0xc04206c1b0)
C:/tools/go/src/syscall/dll_windows.go:301 +0x36
main.main()
D:/temp/testdll/main.go:30 +0x1eb
exit status 2
原因是32位用32位的dll,64位用64位的dll,我的平台是64位,vs2013默认的工程是32位,需创建个64位的配置编译
2、回调函数返回值不一致
错误如下:
panic: compileCallback: output parameter size is wrong
goroutine 1 [running]:
syscall.compileCallback(0x4a8500, 0x4cad88, 0x0, 0x0)
C:/tools/go/src/runtime/syscall_windows.go:53 +0x346
syscall.NewCallbackCDecl(0x4a8500, 0x4cad88, 0x2)
C:/tools/go/src/syscall/syscall_windows.go:134 +0x41
main.main()
D:/temp/testdll/main.go:37 +0x3aa
exit status 2
这个是因为原始代码有两处错误,
在c代码的错误:
typedef void(*CB_MY)(float nVal,float fVal);
应该是typedef int (*CB_MY)(float nVal,float fVal);
在go代码的错误:
func cb_my(val1 float32, val2 float32) int32
应该是
func cb_my(val1 float32, val2 float32) int
3、回调函数输出的值错误
这个没有搞明白为啥float参数打印都值都是0,我全部改int就好了(c和go代码都需要修改)
有疑问加站长微信联系(非本文作者)