go 调用windows dll 的方法

摘要:
=0{//abort//}else{//handle=ret//}//return//}//windows下的另一种DLL方法调用funcShowMessage2{user32:=syscall.NewLazyDLLMessageBoxW:=user32.NewProcMessageBoxW.Call}//windows下的第三种DLL方法调用funcShowMessage3{user32,_:=syscall.LoadDLLMessageBoxW,_:=user32.FindProcMessageBoxW.Call}funcmain(){//defersyscall.FreeLibrarydefersyscall.FreeLibrary//释放指定的动态链接库ShowMessage2("windows下的另一种DLL方法调用","HELLO!")ShowMessage3("windows下的第三种DLL方法调用","HELLO3!

go 调用windows dll 的方法 ,代码如下:

package main
import (
	"fmt"
	"syscall"
	"time"
	"unsafe"
)

const (
	MB_OK                = 0x00000000
	MB_OKCANCEL          = 0x00000001
	MB_ABORTRETRYIGNORE  = 0x00000002
	MB_YESNOCANCEL       = 0x00000003
	MB_YESNO             = 0x00000004
	MB_RETRYCANCEL       = 0x00000005
	MB_CANCELTRYCONTINUE = 0x00000006
	MB_ICONHAND          = 0x00000010
	MB_ICONQUESTION      = 0x00000020
	MB_ICONEXCLAMATION   = 0x00000030
	MB_ICONASTERISK      = 0x00000040
	MB_USERICON          = 0x00000080
	MB_ICONWARNING       = MB_ICONEXCLAMATION
	MB_ICONERROR         = MB_ICONHAND
	MB_ICONINFORMATION   = MB_ICONASTERISK
	MB_ICONSTOP          = MB_ICONHAND

	MB_DEFBUTTON1 = 0x00000000
	MB_DEFBUTTON2 = 0x00000100
	MB_DEFBUTTON3 = 0x00000200
	MB_DEFBUTTON4 = 0x00000300
)

func abort(funcname string, err syscall.Errno) {
	panic(funcname + " failed: " + err.Error())
}

var (
	//    kernel32, _        = syscall.LoadLibrary("kernel32.dll")
	//    getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")

	user32, _     = syscall.LoadLibrary("user32.dll")
	messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")
)

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

func StrPtr(s string) uintptr {
	return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}

func MessageBox(caption, text string, style uintptr) (result int) {
	ret, _, callErr := syscall.Syscall9(messageBox,
		4,
		0,
		StrPtr(text),
		StrPtr(caption),
		style,
		0, 0, 0, 0, 0)
	if callErr != 0 {
		abort("Call MessageBox", callErr)
	}
	result = int(ret)
	return
}

//func GetModuleHandle() (handle uintptr) {
//    if ret, _, callErr := syscall.Syscall(getModuleHandle, 0, 0, 0, 0); callErr != 0 {
//        abort("Call GetModuleHandle", callErr)
//    } else {
//        handle = ret
//    }
//    return
//}

// windows下的另一种DLL方法调用
func ShowMessage2(title, text string) {
	user32 := syscall.NewLazyDLL("user32.dll")
	MessageBoxW := user32.NewProc("MessageBoxW")
	MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}

// windows下的第三种DLL方法调用
func ShowMessage3(title, text string) {
	user32,_ := syscall.LoadDLL("user32.dll")
	MessageBoxW,_ := user32.FindProc("MessageBoxW")
	MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}

func main() {
	//    defer syscall.FreeLibrary(kernel32)
	defer syscall.FreeLibrary(user32) //释放指定的动态链接库

	ShowMessage2("windows下的另一种DLL方法调用", "HELLO !")

	ShowMessage3("windows下的第三种DLL方法调用", "HELLO3 !")

	//fmt.Printf("Retern: %d
", MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL))
	num := MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL)
	fmt.Printf("Get Retrun Value Before MessageBox Invoked: %d
", num)

	time.Sleep(3 * time.Second)
}

func init() {
	fmt.Print("Starting Up
")
}

免责声明:文章转载自《go 调用windows dll 的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jmeter 中的 Beanshell 使用JavaScript 拖放效果下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Vue中进行断点调试的两种方式(使用外部浏览器和VsCode Debug for Chrome 插件)

但是在Vue中如果想要进行调试时,如果是在js中调试的话,可以直接添加一个debugger,然后在浏览器中打开检查进行断点调试。比如:在Vue页面中,点击搜索按钮时搜索会触发handleQuery方法resetQuery(){this.resetForm;this.handleQuery();},其中调用了请求查询数据的方法handleQuery(){thi...

Gradle在Mac上安装及Idea中配置

前言笔者在安装Gradle的过程中发现过程有点繁琐且安装教程比较少,因此记录一下安装过程,方便同行参考环境信息macOS:10.15.5IntelliJIDEA:2020.3Gradle:6.8.2Java:1.8.0_151Homebrew:3.0.1进入Gradle官网点此进入Gradle官网点击安装安装文档包管理安装安装brew本次安装使用brew安装...

"SQLserver 事务日志已满"解决方法

如果不够,备份后换个地方存[注:tempdb你数据库名称。...

Cesium快速上手10-Viewer Entities组合

src=Box.html&label=Geometriesimage.pngbox就是立方体cylinder是圆锥圆柱varviewer=newCesium.Viewer;varblueBox=viewer.entities.add;varredBox=viewer.entities.add;varoutlineOnly=viewer.entitie...

JS前端数据多条件筛选(商品搜索)

有时候也会需要在前端进行数据筛选,增强交互体验。当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦。进行商品按条件筛选主要是利用Arrary.prototype.filter对数组元素进行遍历检查,返回一个符合检查条件的新数组,不会改变原数组。为了能自动适配不同的筛选条件,将筛选条件分为两个大类,一个是区间类型rangesFilter,如:品牌、...

Windows桌面开发者的必备软件

LuaForWindows还自带了一个Scite编辑器,节省了找一个程序员相关编辑器的步骤。http://luaforwindows.luaforge.net/3,7-zip,不需要安装winzip或者winrar了http://www.7-zip.org/4,Sysinternals套件,windows开发必备。http://technet.microso...