1. 程式人生 > 程式設計 >GO 呼叫 DLL 類庫

GO 呼叫 DLL 類庫

最近一個專案需要用到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 正常讀取