go 调用windows dll 的三种方法
发布时间:2020-12-14 02:34:01 所属栏目:Windows 来源:网络整理
导读:参考:https://blog.csdn.net/qq_39584315/article/details/81287669 大部分代码参考:https://studygolang.com/articles/2712 第三种方法是从Gosrcinternalsyscallwindowssysdll源码中找到的,三种方法的具体区别还不是很明晰, 初步判断:lazy应该是
参考:https://blog.csdn.net/qq_39584315/article/details/81287669 大部分代码参考:https://studygolang.com/articles/2712 第三种方法是从Gosrcinternalsyscallwindowssysdll源码中找到的,三种方法的具体区别还不是很明晰, 初步判断:lazy应该是相当于动态库,其余两种直接把库加载到内存。 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 ( 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) if callErr != 0 { abort("Call MessageBox",callErr) } result = int(ret) return } //func GetModuleHandle() (handle uintptr) { // if ret,callErr := syscall.Syscall(getModuleHandle,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(title),IntPtr(0)) } // windows下的第三种DLL方法调用 func ShowMessage3(title,text string) { user32,_ := syscall.LoadDLL("user32.dll") MessageBoxW,_ := user32.FindProc("MessageBoxW") MessageBoxW.Call(IntPtr(0),IntPtr(0)) } func main() { defer syscall.FreeLibrary(user32) num := MessageBox("Done Title","This test is Done.",MB_YESNOCANCEL) fmt.Printf("Get Retrun Value Before MessageBox Invoked: %dn",num) ShowMessage2("windows下的另一种DLL方法调用","HELLO !") ShowMessage3("windows下的第三种DLL方法调用","lyslyslys !") time.Sleep(3 * time.Second) } func init() { fmt.Print("Starting Upn") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows-server-2008-r2 – 为什么Window的SSL Cipher-Suit
- bat想要写一个卸载软件的脚本,最后宣布失败
- windows – TrueCrypt还是EFS?
- Windows禅道环境部署
- 为什么这个类库dll无法从app.config获取信息
- windows-services – 使用Inno Setup在Windows(Vista / XP
- Windows Server 2008 R2 RAS VPN:内部接口ip上的访问服务器
- winapi – Windows的低级键盘输入
- 如何在Windows客户端和Linux NTP服务器之间同步时间?
- 如何从Windows应用程序编程(使用C#.NET的WinForms)转移到We
推荐文章
站长推荐
- windows-phone-7 – 使用Windows Phone 7中的Web
- 如何在Windows PC上导出C项目并在Linux上运行?
- Windows Powershell 对于布尔值的处理
- (转)解决windows10下无法安装.net framework 3.5
- windows-phone-7 – 如何从Windows Phone 7或8获
- 远程桌面报错解决:No Remote Desktop License S
- windows-server-2003 – 免费的Windows服务器防病
- window2016 域重命名
- 是否有类似于Windows WINAPI的Core Linux API,特
- 文档生成 – 如何获取Microsoft HTML帮助2编译器
热点阅读