美文网首页
GO 调用 DLL 类库

GO 调用 DLL 类库

作者: MiaoWoo | 来源:发表于2019-08-26 10:56 被阅读0次

    最近一个项目需要用到Go调用C++的DLL类库 这里记录一下坑

    DLL 原型

    GetDllVersion
    函数原型:
    unsigned int GetDllVersion(void);
    获取dll版本信息
    返回值:DLL版本信息((unsigned int),高字节为主版本信息,低字节为子版本信息
    =====================================================================
    SetQianNiuPath
    函数原型:
    int SetQianNiuPath(const char * Path, unsigned int PathLen);
    设置千牛安装路径(DLL不保存路径)
    参数:
      Path,千牛安装路径(最长不要超过255个字符)
      PathLen,安装你路径长度
    返回值:0 成功
        -1 路径存在问题
        -2 路径文件夹不存在
    =====================================================================
    

    GO调用DLL

    package main
    
    import (
        "fmt"
        "syscall"
        "unsafe"
    )
    
    var (
        multiQianniuLogin = syscall.NewLazyDLL("MultiQianniuLoginDll.dll")
        getDllVersion     = multiQianniuLogin.NewProc("GetDllVersion")
    )
    
    // 获取字符串的长度指针
    func lenPtr(s string) uintptr {
        return uintptr(len(s))
    }
    
    // 获取数字的指针
    func intPtr(n int) uintptr {
        return uintptr(n)
    }
    
    // 获取字符串的指针
    func strPtr(s string) uintptr {
        return uintptr(unsafe.Pointer(syscall.StringBytePtr(s)))
    }
    
    func main() {
        var ret uintptr
        var err error
        ret, _, err = getDllVersion.Call()
        fmt.Printf("%d.%d\n", byte(ret), uint8(ret>>8))
        fmt.Println(err)
        path := "C:\\Program Files (x86)\\AliWorkbench"
        _, _, err = setQianNiuPath.Call(strPtr(path), lenPtr(path))
        fmt.Println(err)
    }
    

    执行结果

    $ GOARCH=386 go run main.go
    1.0
    The operation completed successfully.
    SetQianNiuPath, C:\Program Files (x86)\AliWorkbench 35
    SetQianNiuPath result 0
    The operation completed successfully.
    

    • 一开始字符串指针用的是 syscall.StringToUTF16Ptr 但是类库只能读取到一个字节 改成 syscall.StringBytePtr 正常读取

    相关文章

      网友评论

          本文标题:GO 调用 DLL 类库

          本文链接:https://www.haomeiwen.com/subject/sqkrectx.html