golang调用windows平台的dll库的方法实现

 更新时间:2025年03月03日 09:59:31   作者:raoxiaoya  
本文主要介绍了golang调用windows平台的dll库的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、dll 和 golang 的编译架构要一直,32位对应32位,64位对应64位,比如如果dll是32位的,而golang是64位的,可能会报错%1 is not a valid Win32 application.

2、有时候存在类型转换,需要开启CGO,比如,如果dll中的函数返回一个字符串,那么返回值是一个字符串指针,还需要将返回值转换成go字符串

import "C"

str := C.GoString((*C.Char)(unsafe.Pointer(ret)))

3、传入dll函数的参数被要求是 uintptr 类型,因此需要做转换。

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 StrPtr(s string) uintptr {
    return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}
package main

import (
	"fmt"
	"syscall"
)

// 设置console模式下标准输出的字体前景色
var f = "SetConsoleTextAttribute"

func main() {
	f1()
	f2()
	f3()
	f4()
}

func f1() {
	// A LazyDLL implements access to a single DLL.
	// It will delay the load of the DLL until the first
	// call to its Handle method or to one of its
	// LazyProc's Addr method.
	//
	// LazyDLL is subject to the same DLL preloading attacks as documented
	// on LoadDLL.
	//
	// Use LazyDLL in golang.org/x/sys/windows for a secure way to
	// load system DLLs.
	dll := syscall.NewLazyDLL("kernel32.dll")
	p := dll.NewProc(f)
	r1, r2, lastError := p.Call(uintptr(syscall.Stdout), uintptr(3))
	fmt.Println(r1, r2, lastError)
}

func f2() {
	// LoadDLL loads the named DLL file into memory.
	//
	// If name is not an absolute path and is not a known system DLL used by
	// Go, Windows will search for the named DLL in many locations, causing
	// potential DLL preloading attacks.
	//
	// Use LazyDLL in golang.org/x/sys/windows for a secure way to
	// load system DLLs.
	dll, _ := syscall.LoadDLL("kernel32.dll")
	p, _ := dll.FindProc(f)
	r1, r2, lastError := p.Call(uintptr(syscall.Stdout), uintptr(4))
	fmt.Println(r1, r2, lastError)
}

func f3() {
	// MustLoadDLL is like LoadDLL but panics if load operation fails.
	dll := syscall.MustLoadDLL("kernel32.dll")
	p := dll.MustFindProc(f)
	r1, r2, lastError := p.Call(uintptr(syscall.Stdout), uintptr(5))
	fmt.Println(r1, r2, lastError)
}

func f4() {
	handle, _ := syscall.LoadLibrary("kernel32.dll")
	defer syscall.FreeLibrary(handle)

	p, _ := syscall.GetProcAddress(handle, f)
	r1, r2, errorNo := syscall.Syscall(p, 2, uintptr(syscall.Stdout), uintptr(6), 0)
	fmt.Println(r1, r2, errorNo)
	// 恢复到白色
	syscall.Syscall(p, 2, uintptr(syscall.Stdout), uintptr(7), 0)
}

在这里插入图片描述

到此这篇关于golang调用windows平台的dll库的方法实现的文章就介绍到这了,更多相关golang调用dll库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Golang使用sqlite3数据库实现CURD操作

    Golang使用sqlite3数据库实现CURD操作

    这篇文章主要为大家详细介绍了Golang使用sqlite3数据库实现CURD操作的相关知识,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2025-03-03
  • Go使用Gin+mysql实现增删改查的详细实例

    Go使用Gin+mysql实现增删改查的详细实例

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动,下面这篇文章主要给大家介绍了关于Go使用Gin+mysql实现增删改查的相关资料,需要的朋友可以参考下
    2022-12-12
  • golang gc的内部优化详细介绍

    golang gc的内部优化详细介绍

    Go编译器在垃圾回收(GC)的扫描标记阶段,对存储无指针键值对的map进行了优化,即在GC扫描时不深入扫描map内部数据,只检查map本身是否需要回收,这一优化显著提升了GC扫描的速度,从而减少了GC对程序性能的影响
    2024-10-10
  • Go语言中并发的工作原理

    Go语言中并发的工作原理

    本文详细讲解了Go语言中并发的工作原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go语言二维数组的传参方式

    Go语言二维数组的传参方式

    这篇文章主要介绍了Go语言二维数组的传参方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • GOLang IO接口与工具使用方法讲解

    GOLang IO接口与工具使用方法讲解

    这篇文章主要介绍了GOLang IO接口与工具使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Go语言中实现Unix风格的进程管道方法实例

    Go语言中实现Unix风格的进程管道方法实例

    这篇文章主要为大家介绍了Go语言中实现Unix风格的进程管道方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 减少 golang 二进制文件大小操作

    减少 golang 二进制文件大小操作

    这篇文章主要介绍了减少 golang 二进制文件大小操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 在Go中构建并发TCP服务器

    在Go中构建并发TCP服务器

    今天小编就为大家分享一篇关于在Go中构建并发TCP服务器的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 解决goland新建项目文件名为红色的问题

    解决goland新建项目文件名为红色的问题

    这篇文章主要介绍了解决goland新建项目文件名为红色的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论