zoukankan      html  css  js  c++  java
  • 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)
    }
    

      

  • 相关阅读:
    树状数组与线段树基础
    阿里云服务器低价购买及域名解析
    ENVI5.3安装教程(含软件下载)
    05 ArcGIS JS API 4.12版本监听view-change事件
    jQuery的AJAX请求成功,但是跳转到error的解决方法
    04 ArcGIS JS API 4.12加载天地图
    02 Portal for ArcGIS 10.7安装部署教程(linux环境)
    10 webpack4.0学习笔记——热替换_devServer
    09 webpack4.0学习笔记——配置文件_HtmlWebpackPlugin使用
    08 webpack4.0学习笔记——配置文件_DefinePlugin使用
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10305274.html
Copyright © 2011-2022 走看看