GO 調用 DLL 類庫

最近一個項目需要用到Go調用C++的DLL類庫 這里記錄一下坑

DLL 原型

GetDllVersion
函數原型:
unsigned int GetDllVersion(void);
獲取dll版本信息
返回值:DLL版本信息((unsigned int),高字節(jié)為主版本信息,低字節(jié)為子版本信息
=====================================================================
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)
}

執(zhí)行結果

$ 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 但是類庫只能讀取到一個字節(jié) 改成 syscall.StringBytePtr 正常讀取
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容