go 调用windows dll 的三种方法
参考:https://blog.csdn.net/qq_39584315/article/details/81287669
大部分代码参考:https://studygolang.com/articles/2712
第三种方法是从Go\src\internal\syscall\windows\sysdll源码中找到的,三种方法的具体区别还不是很明晰,
初步判断: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,
,
,
StrPtr(text),
StrPtr(caption),
style,
, , , , )
if callErr != {
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(), StrPtr(text), StrPtr(title), IntPtr())
} // windows下的第三种DLL方法调用
func ShowMessage3(title, text string) {
user32, _ := syscall.LoadDLL("user32.dll")
MessageBoxW, _ := user32.FindProc("MessageBoxW")
MessageBoxW.Call(IntPtr(), StrPtr(text), StrPtr(title), IntPtr())
} func main() {
defer syscall.FreeLibrary(user32) num := MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL)
fmt.Printf("Get Retrun Value Before MessageBox Invoked: %d\n", num)
ShowMessage2("windows下的另一种DLL方法调用", "HELLO !") ShowMessage3("windows下的第三种DLL方法调用", "lyslyslys !") time.Sleep( * time.Second)
} func init() {
fmt.Print("Starting Up\n")
}
go 调用windows dll 的三种方法的更多相关文章
- (转)JAVA 调用Web Service的三种方法
1.使用HttpClient用到的jar文件:commons-httpclient-3.1.jar方法:预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成. ...
- Windows下gcc以及Qt的DLL文件调用之总结(三种方法)
DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...
- shell脚本中调用其他脚本的三种方法
方法一:使用 . #. ./sub.sh 方法二:使用 source #source ./sub.sh 方法三:使用 sh #sh ./sub.sh 注意: 1.两个点之间,要有空 ...
- Python——调用shell命令的三种方法
1.用os.system(cmd) 不过取不了返回值 2.用os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如a=os.popen(cmd ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- go 调用windows dll 的方法
go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...
- Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)
1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...
- Windows 10 应用创建模糊背景窗口的三种方法
原文 Windows 10 应用创建模糊背景窗口的三种方法 现代的操作系统中创建一张图片的高斯模糊效果非常容易,不过如果要在窗口中获得模糊支持就需要操作系统的原生支持了.iOS/Mac 和 Windo ...
- YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法
上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...
随机推荐
- 【Java每日一题】20170223
20170222问题解析请点击今日问题下方的“[Java每日一题]20170223”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...
- Netty实战二之自己的Netty应用程序
接下来我们将展示如何构建一个基于Netty的客户端和服务器,程序很简单:客户端将消息发送给服务器,而服务器再将消息回送给客户端,这将是一个对你而言很重要的第一个netty的实践经验. 1.设置开发环境 ...
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- C#设计模式之十四命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路 ...
- Android Studio 学习(二) UI
TextView android:gravity="center"居中对齐 //文字对齐方式 top bottom left right center android:textSi ...
- jQuery效果之封装一个文章图片弹出放大效果
首先先搭写一个基本的格式: $.fn.popImg = function() { //your code goes here } 然后用自调用匿名函数包裹你的代码,将系统变量以变量形式传递到插件内部, ...
- 服务器端使用jstat定位GC问题的有关命令
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量. 命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意!!! ...
- C# 利用ZXing.Net来生成条形码和二维码
本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...
- Android项目实战(四十七):轮播图效果Viewpager
简易.常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V 需求如下: 不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最 ...
- Android为TV端助力 很详细的序列化过程Parcelable
直接上代码:注释都写的很清楚了. public class Entry implements Parcelable{ public int userID; public String username ...