• Golang调用windows下的dll动态库中的函数


    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
    ", 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)
        ShowMessage2("windows下的第二种DLL方法调用", "HELLO !")
        time.Sleep(3 * time.Second)
    }
    
    func init() {
        fmt.Print("Starting Up
    ")
    }
    
    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)
    }
    

      

  • 相关阅读:
    CNN(卷积神经网络)入门
    基于linux vim环境python代码自动补全
    Linux 基本bash命令
    基于pytorch的CNN、LSTM神经网络模型调参小结
    深度学习中Batch size对训练效果的影响
    argparse.ArgumentParser()用法解析
    大数据学习之Hive数据仓库 20
    centOS中安装MySQL超级方便简单的方法
    大数据学习之zookeeper案例节点动态上下线感知19
    大数据学习之zookeeper客户端的命令行及API操作18
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10305274.html
Copyright © 2020-2023  润新知