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.
(0)

相关推荐

  • 易语言如何调用DLL文件

    众所周知,易语言的编程门槛普遍较低,因为它更加"本土化",说白了就是更"接地气".然而,还是有一部分易语言初学者,依旧陷入"DLL调用"的泥 ...

  • 如何打开DLL文件

    动态链接库又称DLL文件,是传统Windows编程的主要支柱.程序利用这些文件来获得额外的功能和库,而不需要将它们嵌入到程序中.通常DLL文件被很多不同的程序共享.对于大多数使用者来说,DLL文件是在 ...

  • 简单DLL文件反编译

    说是简单的意思就是没有加密货混淆的DLL文件了.由于今天突然要破解个域名限制,查看了N多资料 整理出了这套比较简单的方法再次分享了 下面是详细步骤. 步骤/方法 01 将你要破解的DLL文件放在C盘 ...

  • binkw32.dll文件信息

    DLL 文件: binkw32 或者 binkw32.dll DLL 名称: Bink Video Player DLL 描述: binkw32.dll是BINK视频解码器相关进程,用于压缩视频回放, ...

  • 易语言如何编写DLL文件

    随着信息技术的不断进步,人们对软件的要求也越来越苛刻.从单纯的面向过程开发模式逐步演变成为面向对象开发模式,为了便于软件的后期维护,于是引入了模块化开发.模块化开发模式自然离不开DLL文件(动态链接库 ...

  • 卸载迅雷后残留无用的DLL文件的处理[图]

    卸载软件后,或多或少地会在机器上残留下一些无用的文件,如DLL文件,十分讨厌。更麻烦的是,经常会出现无法删除这些残留的DLL文件的情况。原因是该DLL文件正在被当前系统运行的进程调用。知道了原因后我们 ...

  • 电脑DLL文件缺失怎么办

    小知识:DLL文件的作用与好处 大家都知道,软件的主程序一般为EXE类型的可执行文件,直接双击它可以启动一个软件.但对DLL文件,知道的可能不如EXE多.DLL是一种"动态链接库" ...

  • Win8.1系统清除DLL文件的方法

    一些用户询问说Win8.1系统怎么清除多余的DLL文件?DLL是Dynamic Link Library的缩写,意为动态链接库.当我们执行某一个程序时,相应的DLL文件就会被调用.一个应用程序可有多个 ...

  • win10电脑中的dll文件如何打开

    我们在使用win10电脑的时候,想要打开其中的dll文件,就会弹出提示窗口,无法打开,该怎么操作才能打开呢?今天就跟大家介绍一下win10电脑中的dll文件如何打开的具体操作步骤.1. 首先我们打开电 ...

  • dnf错误126未找到dll文件 解决方案

    dnf错误126未找到dll怎么办?是什么原因导致的呢?下面由我带给大家dnf错误126未找到dll文件的解决方案 操作方法 01 原因:其实出现这种情况大多数原因是因为DLL文件被误删,或者游戏无法 ...