zoukankan      html  css  js  c++  java
  • go 调用windows dll 的三种方法

    参考:https://blog.csdn.net/qq_39584315/article/details/81287669

    大部分代码参考:https://studygolang.com/articles/2712

    第三种方法是从Gosrcinternalsyscallwindowssysdll源码中找到的,三种方法的具体区别还不是很明晰,

    初步判断:lazy应该是相当于动态库,其余两种直接把库加载到内存。

    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")
        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))
    }
    
    // windows下的第三种DLL方法调用
    func ShowMessage3(title, text string) {
        user32, _ := syscall.LoadDLL("user32.dll")
        MessageBoxW, _ := user32.FindProc("MessageBoxW")
        MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
    }
    
    func main() {
        defer syscall.FreeLibrary(user32)
    
        num := MessageBox("Done Title", "This test is Done.", MB_YESNOCANCEL)
        fmt.Printf("Get Retrun Value Before MessageBox Invoked: %d
    ", num)
        ShowMessage2("windows下的另一种DLL方法调用", "HELLO !")
    
        ShowMessage3("windows下的第三种DLL方法调用", "lyslyslys !")
    
        time.Sleep(3 * time.Second)
    }
    
    func init() {
        fmt.Print("Starting Up
    ")
    }
  • 相关阅读:
    executable binary cannot run on android marshmallow (android 6.0)
    Android std and stl support
    Android std and stl support
    (OK) static linked & dynamically linked
    (OK)(OK) cross compile quagga-0.99.21mr2.2 for android-x86 in Fedora23
    linux和STL 常用头文件及说明
    Firefox 新增容器标签:可同时登录多个用户
    Android —— API Level
    Android added new permission model for Android 6.0 (Marshmallow).
    (OK) Android adb连接VirtualBox方式
  • 原文地址:https://www.cnblogs.com/pu369/p/10350696.html
Copyright © 2011-2022 走看看