首先需要知道什么是DLL?
.dll动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的,简单理解就是将一个函数或者模块存放在外部文件,所有语言可调用的程序。
创建DLL
我们先从生成DLL开始,以下是一个简单的例子,Sum函数接收a、b变量返回变量之和。
package main
//生成头文件所需,可以试试去掉是什么效果
import "C"
//export Sum
func Sum(a, b int) int {
return a + b
}
func main() {
//可以为空但不能没有main函数
}
需要注意export关键字用来声明该函数的可导出性。
接下来开始编译DLL程序,命令如下
go build -ldflags "-s -w" -buildmode=c-shared -o Dll名称.dll 包名.go
此处需要开启cgo不过你都开始研究这个了我就不教这个了。
调用DLL
Go语言调用dll非常简单,仅需几行代码。
我们使用syscall包中的NewlazyDLL方法来导入DLL程序,因为这是最简单方便的方法。
首先导入DLL程序
dll := syscall.NewLazyDLL("目录")
导入完毕后使用DLL中的方法也就是函数,我们这里使用刚刚的SUM方法,这里可以理解查找函数。
proc := l.NewProc("Sum")
接下来开始传参并调用函数
r1, r2, msg := proc.Call(9, 7)
fmt.Println(r1, r2, msg)
调用结果
16 17018880 The operation completed successfully.
其他说明
本文使用了最简单的方式来演示创建DLL和使用DLL的方式,需要注意的是
- 创建时DLL是需要注意GO语言的数据类型不能直接使用。
export导出关键字必须使用main入口函数必须要有cgo需要打开Call传参时参数是uintptr类型