golang調(diào)用dll的接口三種方式小結(jié)
1.使用syscall.NewLazyDLL()加載dll,使用接口函數(shù).Call(uintptr類型的參數(shù))來調(diào)用函數(shù)
(1)例如:調(diào)用初始化接口函數(shù)進(jìn)行初始化操作
dllpath:="test.dll"
handle:=syscall.NewLazyDLL(dllpath)
//引號中的init即為dll中的函數(shù)方法
init:=handle.NewProc("init")
init.Call(BytePtr("C:\\dll"))(2)將string類型轉(zhuǎn)換為uintptr類型的函數(shù)如下
func BytePtr(str string)uintptr{
s:=[]byte(str)
return uintptr(unsafe.Pointer(&s[0]))
}(3)可將調(diào)用初始化接口后得到的handle返回,后續(xù)調(diào)用該dll中其他接口方法時(shí)就可直接使用handle.NewProc("接口方法名"),具體如下
func call_Init()*syscall.LazyDLL{
dllpath:="test.dll"
handle:=syscall.NewLazyDLL(dllpath)
//引號中的init即為dll中的函數(shù)方法
init:=handle.NewProc("init")
init.Call(BytePtr("C:\\dll"))
return handle
}
2.使用syscall.MustLoadDLL(dllPath)加載dll,函數(shù)接口函數(shù).Call(參數(shù)列表)調(diào)用
(1)例如:調(diào)用callByReference接口函數(shù)
func Call_PassByValue(n int) error {
dllPath := "E:\\Code\\vs2015_project\\demo\\x64\\Release\\c2plusdll.dll"
handle := syscall.MustLoadDLL(dllPath)
callByReference := handle.MustFindProc("callByReference")
ret, _, err := callByReference.Call(IntPtr(n))
if err != nil {
fmt.Println("DllTestDef的運(yùn)算結(jié)果為:", ret)
}
return nil
}
(2)將int類型轉(zhuǎn)換為uintptr類型的函數(shù)如下:
func IntPtr(n int)uintptr{
return uintptr(n)
}3.使用syscall.LoadLibrary(dllPath)函數(shù)加載dll,syscall.Syscall(...)函數(shù)調(diào)用具體的函數(shù)接口,如下:
(1)例如:調(diào)用獲取數(shù)據(jù)接口函數(shù)
func get_ConnData()string{
dllPath := "C:\\dll"
handle, err := syscall.LoadLibrary(dllPath)
if err != nil {
fmt.Printf("Error: %s\n", err)
return err
}
defer syscall.FreeLibrary(handle)
export_conn, err := syscall.GetProcAddress(handle, "export_conn")
if err != nil {
fmt.Printf("Error: %s\n", err)
return err
}
ret, _, _ := syscall.Syscall(export_conn, IntPtr("5"))
if err != nil {
fmt.Printf("Error: %s\n", err)
}
return uintptrTostr(ret)
}(2)其中uintptrTostr函數(shù)為
func uintptrTostr(ptr uintptr)string{
p:=(*byte)(unsafe.Pointer(ptr))
data:=make([]byte,0)
for *p!=0{
data=append(data,*p)
ptr+=unsafe.Sizeof(byte(0))
p=(*byte)(unsafe.Pointer(ptr))
}
return string(data)
}到此這篇關(guān)于golang調(diào)用dll的接口三種方式小結(jié)的文章就介紹到這了,更多相關(guān)golang調(diào)用dll接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang信號處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解
這篇文章主要給大家介紹了關(guān)于Golang信號處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
go語言使用gorilla/websocket實(shí)現(xiàn)websocket
Gorilla WebSocket 是一個(gè)用于 Go 語言的 WebSocket 協(xié)議實(shí)現(xiàn),而且是一個(gè)優(yōu)秀的組件庫,能快速實(shí)現(xiàn)websocket協(xié)議,下面就跟隨小編一起來看看它的具體使用吧2025-04-04
使用gin框架搭建簡易服務(wù)的實(shí)現(xiàn)方法
go語言web框架挺多的,本文就介紹了一下如何使用gin框架搭建簡易服務(wù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
golang給函數(shù)參數(shù)設(shè)置默認(rèn)值的幾種方式小結(jié)(函數(shù)參數(shù)默認(rèn)值
在日常開發(fā)中我們有時(shí)候需要使用默認(rèn)設(shè)置,下面這篇文章主要給大家介紹了關(guān)于golang給函數(shù)參數(shù)設(shè)置默認(rèn)值的幾種方式小結(jié)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
Golang標(biāo)準(zhǔn)庫time包日常用法小結(jié)
本文主要介紹了Golang標(biāo)準(zhǔn)庫time包日常用法小結(jié),可以通過它們來獲取當(dāng)前時(shí)間、創(chuàng)建指定時(shí)間、解析時(shí)間字符串、控制時(shí)間間隔等操作,感興趣的可以了解一下2023-11-11
從基礎(chǔ)到高級全方位解析Go中反射的應(yīng)用
本文我們將全面深入地探討Go語言的反射機(jī)制,從反射的基礎(chǔ)概念、為什么需要反射,到如何在Go中實(shí)現(xiàn)反射,以及在高級編程場景如泛型編程和插件架構(gòu)中的應(yīng)用,需要的可以參考下2023-10-10

