前端之家收集整理的这篇文章主要介绍了
Golang调用windows下的dll动态库中的函数,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Golang调用windows下的dll动态库中的函数
使用syscall调用。
@H_
403_3@
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")
message
Box,_ = 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 Message
Box(caption,text
string,style
uintptr) (result
int) {
ret,_,callErr := syscall.Syscall9(message
Box,
4,
0,StrPtr(text),StrPtr(caption),style,
0)
if callErr !=
0 {
abort(
"Call MessageBox",callErr)
}
result =
int(ret)
return
}
func ShowMessage2(title,text
string) {
user32 := syscall.NewLazyDLL(
"user32.dll")
Message
BoxW := user32.NewProc(
"MessageBoxW")
Message
BoxW.Call(IntPtr
(0),StrPtr(title),IntPtr
(0))
}
func main() {
defer syscall.FreeLibrary(user32)
num := Message
Box(
"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")
}