网络上有太多简单例子了,简单例子能通不过,不一定可以为所欲为的用这种方法了。。。
我看很多资料上都有讲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除外
有疑问加站长微信联系(非本文作者)