2018-11-27 Golang与DLL交互

oracle3 · · 885 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

参考《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代码都需要修改)


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:oracle3

查看原文:2018-11-27 Golang与DLL交互

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

885 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传