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)
    }
    

      

  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10305274.html
Copyright © 2011-2022 走看看