首页 > 其他分享 >golang编译为dll与调用dll简单样例

golang编译为dll与调用dll简单样例

时间:2022-12-07 15:46:36浏览次数:40  
标签:return err uintptr 样例 dll golang func main

==前置准备==

1、golang版本:1.18

2、安装MinGW(我的环境本身已经安装好了,没有验证不安装是否可以生成)

 

==编译为DLL==

【代码样例】

package main

import "C"

//export Sum
func Sum(a, b int) int {
    return a + b
}

func main() {
    // 编译命令
    // go build -buildmode=c-shared -o mydll.dll .\build_to_dll.go
}

 

注意事项:

1、需要有import "C"

2、输出函数需要有//export,同时需要注意//与export之间不能有空格

3、需要有main函数,可以不写,main函数不是对外输出函数

 

【编译命令】

go build -buildmode=c-shared -o mydll.dll .\build_to_dll.go

 

正常编译后会生成.dll及.h文件,如下图所示

 

==调用DLL==

【代码样例】

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

func IntPtr(n int) uintptr {
    return uintptr(n)
}

func Int2IntPtr(n int) uintptr {
    return uintptr(unsafe.Pointer(&n))
}

func IntPtr2Ptr(n *int) uintptr {
    return uintptr(unsafe.Pointer(n))
}

func BytePtr(s []byte) uintptr {
    return uintptr(unsafe.Pointer(&s[0]))
}

func main() {
    dllPath := "D:\\work\\10_Git\\golang\\src\\golang-demo\\dll\\mydll.dll"
    handle, err := syscall.LoadLibrary(dllPath)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer func(handle syscall.Handle) {
        _ = syscall.FreeLibrary(handle)
    }(handle)

    sum, err := syscall.GetProcAddress(handle, "Sum")
    if err != nil {
        fmt.Println(err.Error())
        return
    }

    r1, r2, e := syscall.SyscallN(sum, 2, IntPtr(4), IntPtr(5), 0)
    if e != 0 {
        fmt.Println(err.Error())
        return
    }

    fmt.Println(fmt.Sprintf("返回结果为:r1=%v, r2=%v, e=%v", r1, r2, e))
}

 

【执行结果】

 

--END--

标签:return,err,uintptr,样例,dll,golang,func,main
From: https://www.cnblogs.com/quchunhui/p/16963248.html

相关文章

  • Java通过JNA方式调用DLL(动态链接库)
    Java通过JNA方式调用DLL(动态链接库)1.JNA简单介绍先说JNI(JavaNativeInterface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进......
  • go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库
    dongle是一个轻量级、语义化、对开发者友好的Golang编码解码和加密解密库Dongle已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/dong......
  • ILSpy使用reflexil修改dll中文件
    这里介绍修改dll中的资源文件ILSpy下载:ILSpy_binaries_7.2.1.6856.zipreflexil下载:reflexil.for.ILSpy.2.7.AIO.bin.zip 1、解压reflexil.for.ILSpy.2.7.AIO.bin.zip......
  • golang的New研究
    直接上代码:packagemainimport( "fmt" "reflect")funcmain(){ varn=33 varpn=&n varppn=&pn //new可以定义不同类型的地址,可以是int/int*/int......
  • C# 把多个dll合并成1个dll的几种方式
    第一种Nuget打包快速入门:使用VisualStudio创建和发布NuGet包(仅限.NETStandard和Windows)|MicrosoftLearn第二种ILRepack.NET使用ILRepack合并多个程序......
  • 使用 gvm 来快速安装或者升级 golang 版本
    gvm是golang的版本管理工具,有点类似于python的pyenv。一、安装gvmbash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gv......
  • golang的defer使用一
    先来看例子:例子1:packagemainimport"fmt"funcrefertest()int{variintfmt.Printf("在没有调用defer之前。i的值为:%d,i的地址为:%p",i,&i)fmt.Println()d......
  • golang的特殊常量iota
    其实iota这个常量应该是编译器的常量,iota是一个编译器在编译过程中动态赋值。iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明......
  • 在c#中调用c++的dll崩溃了,try catch 怎么获取异常?
    在framework框架下,通过添加HandleProcessCorruptedStateExceptionsAttribute属性来解决这个问题,(.netcore1.0到3.1之前,不支持从损坏的进程状态异常中恢复,即trycatch没有......
  • Wps调用dll操作Excel表格转PDF
     起始原因:wps编辑创建的文档在microsoftoffice中打开,会报内容存在异常是否恢复,因此wps文件被微软设定为破损文件,无法对原有文档进行操作运行,故在此使用wps对Excel进行......