关于go在windows下生成的dll,怎么让go自己使用(请不要用简单例子)

GuoYuefei · · 316 次点击 · 开始浏览    置顶
网络上有太多简单例子了,简单例子能通不过,不一定可以为所欲为的用这种方法了。。。 我看很多资料上都有讲gc的问题,还有指针的问题。我怀疑我的问题可能也出自这里。。。 ```golang package main import "C" import "fmt" func main() { // 文档说"要有" } //export Sum func Sum(a int, b int) int { return a + b } type IPlugin interface { ID() int } type Plugin struct { id int } func (p Plugin)ID() int { return p.id } var P = Plugin{id:12} //export Some func Some() int { fmt.Println(P.ID()) return P.ID() } ``` 以上是buildmode=c-shared的 ```golang func lib_some() { dll := syscall.NewLazyDLL("./p.dll") fmt.Println("p dll:", dll.Name) Some := dll.NewProc("Some") fmt.Println("+++", Some) //var id = 12 r1, r2, lastErr := Some.Call() fmt.Println(r1, r2, lastErr) } ``` 以上是用于主函数执行的 ``` p dll: ./p.dll +++ &{{0 0} Some 0xc000058420 <nil>} fatal error: unexpected signal during runtime execution [signal 0xc0000005 code=0x1 addr=0x0 pc=0x64693df8] goroutine 1 [running, locked to thread]: runtime.throw(0x64721be8, 0x2a) C:/Go/src/runtime/panic.go:617 +0x79 fp=0xc00008b7d8 sp=0xc00008b7a8 pc=0x6466bb29 runtime.sigpanic() C:/Go/src/runtime/signal_windows.go:227 +0x272 fp=0xc00008b808 sp=0xc00008b7d8 pc=0x6467c452 runtime.memmove(0x0, 0xc000094400, 0x1) C:/Go/src/runtime/memmove_amd64.s:146 +0x108 fp=0xc00008b810 sp=0xc00008b808 pc=0x64693df8 runtime.heapBitsSetType(0xc000094400, 0x400, 0x400, 0x64707660) C:/Go/src/runtime/mbitmap.go:1400 +0x4ae fp=0xc00008b918 sp=0xc00008b810 pc=0x6465382e runtime.mallocgc(0x400, 0x64707660, 0xc00008e001, 0x8) C:/Go/src/runtime/malloc.go:969 +0x55b fp=0xc00008b9b8 sp=0xc00008b918 pc=0x6464b85b runtime.makeslice(0x64707660, 0x8, 0x8, 0x0) C:/Go/src/runtime/slice.go:49 +0x73 fp=0xc00008b9e8 sp=0xc00008b9b8 pc=0x6467c733 sync.(*Pool).pinSlow(0x646e1450, 0x0) C:/Go/src/sync/pool.go:212 +0xc7 fp=0xc00008ba50 sp=0xc00008b9e8 pc=0x6469b697 sync.(*Pool).pin(0x646e1450, 0xc00001e500) ``` 以上是爆的错误 纠结ing。。。。 把生成dll的以第一文件里的Some函数中的fmt.Println去掉就不会报错,正常使用。讲fmt.Println改成println也是可以的,是不是引用包fmt的原因? 请问如果我要使用go自己编的dll的时候应该要注意些什么呢? 想在windows上实现插件的功能,貌似能想到较好的方法就这种了。如果还有其他方法,望请告知!RFC除外

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

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