golang怎麼編譯、呼叫dll檔案

編譯

exportgo.go

package main import "C" /*    export PrintBye 的意思是將PrintBye方法通過PrintBye名暴露出去 */ //export PrintBye func PrintBye() {    /*       這裡是只能用println       不能用:log.Println()和fmt.Println()    */    println("From DLL: Bye!") } //export Sum func Sum(a C.int, b C.int) C.int {    return a   b } //export Sub func Sub(a C.int, b C.int) C.int {    return a - b } //export Hello func Hello(a C.int, b C.int) C.int {    return a * b } func main() {    // Need a main function to make CGO compile package as C shared library }

編譯

>go build -buildmode=c-shared -o exportgo.dll exportgo.go

編譯完成後,生成exportgo.dll和exportgo.h

呼叫

Called.go

package main import "C" import (     "log"     "syscall" ) func main() {     log.SetFlags(log.LstdFlags | log.Lshortfile)     F4(50,30)     F5(50,30)     F6() } func F4(int1, int2 int) {     log.Println(int1, int2)     //引入dll檔案方法1     dll := syscall.MustLoadDLL("exportgo.dll")     //使用完後要釋放     defer dll.Release()     //呼叫dll的方法Sum     proc := dll.MustFindProc("Sum")     //使用sum函式,傳遞引數int1和int2     call, u, err := proc.Call(uintptr(int1), uintptr(int2))     //輸出結果call     log.Println(call)     log.Println(u)     log.Println(err) } func F5(int1, int2 int) {     //引入dll檔案方法2     dll := syscall.NewLazyDLL("exportgo.dll")     //呼叫dll的方法Sub     proc := dll.NewProc("Sub")     //使用Sub函式,傳遞引數int1和int2     r, err, msg := proc.Call(uintptr(int1), uintptr(int2))     //輸出結果r     log.Println(r)     log.Println(err)     log.Println(msg) } func F6() {     //引入dll檔案     dll := syscall.NewLazyDLL("exportgo.dll")     //呼叫dll的方法PrintBye     proc := dll.NewProc("PrintBye")     //呼叫dll的方法,不傳遞任何值     r, err, msg := proc.Call()     //輸出結果r     log.Println(r)     log.Println(err)     log.Println(msg) }

執行結果

2022/03/26 14:48:00 Called.go:16: 50 30 2022/03/26 14:48:00 Called.go:26: 80 2022/03/26 14:48:00 Called.go:27: 8791506616320 2022/03/26 14:48:00 Called.go:28: The operation completed successfully. 2022/03/26 14:48:00 Called.go:38: 20 2022/03/26 14:48:00 Called.go:39: 8791503994880 2022/03/26 14:48:00 Called.go:40: The operation completed successfully. From DLL: Bye! 2022/03/26 14:48:00 Called.go:50: 0 2022/03/26 14:48:00 Called.go:51: 8791503994880 2022/03/26 14:48:00 Called.go:52: The operation completed successfully.