为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 网络编程 > 其它综合 正文

golang怎么编译、调用dll文件

三叶资源网 2022-11-02 19:18:50 其它综合 277 ℃ 0 评论

编译

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.

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
断点下载百度树型框应用易语言视频教程宽带拨号常量支持库JS改写sqlite3图文识别微信发卡机器人鱼刺类正则表达式超级列表框背景透明加密壳有道翻译APP协议今日头条自动审核进群express界面算法模块源码
最新评论