Golang调用windows下的dll动态库中的函数 
使用syscall调用。

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))
} func main() {
// defer syscall.FreeLibrary(kernel32)
defer syscall.FreeLibrary(user32) //fmt.Printf("Retern: %d\n", 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\n", num)
ShowMessage2("windows下的第二种DLL方法调用", "HELLO !")
time.Sleep(3 * time.Second)
} func init() {
fmt.Print("Starting Up\n")
}
package main

import "syscall"

func main() {
// test.dll
// int add(int x, int y) h, err := syscall.LoadLibrary("test.dll")
if (err != nil){
panic(err.Error())
}
defer syscall.FreeLibrary(h)
proc, err := syscall.GetProcAddress(h, "add")
if (err != nil) {
panic(err.Error())
}
r, _, _ := syscall.Syscall(uintptr(proc), 2, 1, 1, 0)
println("r=", r) dll := syscall.NewLazyDLL("test.dll")
add := dll.NewProc("add")
ret, _, _ := add.Call(uintptr(1), uintptr(1))
println("1+1=", ret)
}

  

Golang调用windows下的dll动态库中的函数的更多相关文章

  1. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

  2. Eclipse下生成.dll动态库及.a静态库使用 for Windows [z]

    以后的主要工作就是做库了,将我们的C或者C++写的接口做成库,给客户端使用,因此有必要知道库的使用和制作方法.主要是在Eclipse下搞了搞,公司用的是Carbide,也差不多.库做好了,用SVN已提 ...

  3. 如何调用.so动态库中的函数,如何把自己的函数导出为.so的动态库函数供别人调用

    调用.so中的函数和平常的函数没有区别,只是在编译连接时加上-lxxxx就行了.要生成.so库,则编译时用下面的语句:gcc -shared -Wl,-soname,libmyfun.so -o li ...

  4. C#将C++动态库的回调函数封装成事件

    关于C#调用C++动态库的文章很多,调用动态库中回调函数的方法也不在少数.但大多数调用回调函数的方法依然保留了C++的语法特点. 比如有一段C++的回调函数代码,为了表达它的意思,我把注释也粘贴了进来 ...

  5. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

  6. Python调用windows下DLL详解

    Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...

  7. java使用JNA框架调用dll动态库

    这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...

  8. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  9. 应用程序调用dll动态库,参数有vector时崩溃的问题

    引用:http://blog.csdn.net/guoliushui/article/details/43017339 今天跟同事遇到了一个问题,问题背景: 一个动态库Tst.dll: 一个应用程序A ...

随机推荐

  1. Fatal error in launcher: Unable to create process using '"'的报错解决

    执行命令前加python -m就好了 python -m pip install --upgrade pip这条命令用来升级pip

  2. 第七课 GDB调试 (下)

    1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前 ...

  3. React:快速上手(3)——列表渲染

    React:快速上手(3)——列表渲染 使用map循环数组 了解一些ES6 ES6, 全称 ECMAScript 6.0 ,是 JaveScript 的下一个版本标准,2015.06 发版.ES6 主 ...

  4. PL/SQL编程—游标

    一.游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然 ...

  5. BKDRHash函数

    unsigned int BKDRHash(char*str) { unsigned ;// 31 131 1313 13131 131313 etc.. unsigned ; while(*str) ...

  6. 谁说程序员不懂爱情【Her】

    2014.8.17日 我和我女朋友恋爱两周年的日子.走到今天很不容易,我很珍惜. 就想趁这机会,尽自己能力做一个特别的礼物. 这款应用两周前就开始计划了.也熬了几个晚上.接触wp开发时间不长,第一款应 ...

  7. 微软名人数据集 ms_celeb_1m 处理(MsCelebV1-Faces-Aligned.tsv)python脚本

    本文主要介绍了如何对MsCelebV1-Faces-Aligned.tsv文件进行提取 原创by南山南北秋悲 欢迎引用!请注明原地址 http://www.cnblogs.com/hwd9654/p/ ...

  8. 获取微信公众号用户的基本信息(UnionID机制)

    获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的open ...

  9. redis主从、集群、哨兵

    redis的主从.集群.哨兵 参考: https://blog.csdn.net/robertohuang/article/details/70741575 https://blog.csdn.net ...

  10. HBase 协处理器编程详解,第二部分:客户端代码编写

    实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...