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=

随便看看

Visual Studio Code 之 运行java代码

2、安装成功后,会在右键菜单中多出一个选项:更改vscode“用户设置”文件:添加java.home以及runcode显示在终端coderunner原生的配置有些问题,更改其中终端的命令:加入红色的部分3、点击RunCode,会执行相应的文件...

MySQL高可用集群方案

资源不足的小团队或小项目直接建议阿里云和腾讯云II。一些常见解决方案介绍1。MySQL主从架构2。MHA架构参考:生产环境MySQL数据库集群MHA在线实现解决方案MHA目前是MySQL高可用性中比较成熟的解决方案。...

PbootCMS后台增加轮播图自定义分组名称

我们知道,在PbootCMS后台的旋转木马图形模块中,当添加新的旋转木马图时,您不能自己选择组。相反,您可以自动创建组,例如组1、组2和组3。这显然对客户的体验不友好,而且您无法直观地知道在网页的哪个位置使用了旋转木马图。让我们分享一下如何启用PbootCMS后台来添加、删除和修改旋转木马图形组。...

ios 苹果和百度地图的相关使用

同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度,确实做一些地图相关的东西,非常有吸引力。只是实现了显示一个百度地图的view。百度地图使用的是Objective-C++,这意味这必须要有一个.mm文件。...

Ubuntu安装时怎样分区

应该首先放置启动分区。并将引导设置为主分区。如果是双系统或多系统安装,通常可以选择逻辑分区。首先,Grub可以在1024柱面后面引导Linux内核;第二,即使有多个Linux安装,/boot也可以完全不共享。此外,非独立/引导分区仅占用根文件夹下约20MB的空间。所以决定是否启动。...

[笔记]manjaro kde主题&手动安装主题

安装manjaroKDE主题。首先,安装manjaro主题,有两种方法:“系统设置”-“全局主题”-“获取新的全局主题”,您还可以在“外观”中获得“等离子样式、应用程序样式、颜色等”的新全局主题“.通过manjarokdestore下载主题,然后将主题导入系统。但是,由于某些原因,方法1在我的计算机上不可行。加载速度非常慢,下载速度非常慢。据说可以通过pro...