golang調(diào)用dll的接口三種方式小結(jié)
1.使用syscall.NewLazyDLL()加載dll,使用接口函數(shù).Call(uintptr類型的參數(shù))來(lái)調(diào)用函數(shù)
(1)例如:調(diào)用初始化接口函數(shù)進(jìn)行初始化操作
dllpath:="test.dll"
handle:=syscall.NewLazyDLL(dllpath)
//引號(hào)中的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)
//引號(hào)中的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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題(推薦)
這篇文章主要介紹了 Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法
這篇文章主要介紹了Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法,涉及Go語(yǔ)言字符串遍歷與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Golang import 導(dǎo)入包語(yǔ)法及一些特殊用法詳解
這篇文章主要介紹了Golang import 導(dǎo)入包語(yǔ)法及一些特殊用法,需要的朋友可以參考下2020-02-02
Go語(yǔ)言定時(shí)任務(wù)cron的設(shè)計(jì)與使用
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中定時(shí)任務(wù)cron的設(shè)計(jì)與使用,文中的示例代碼講解詳細(xì),對(duì)我們深入掌握Go語(yǔ)言有一定的幫助,需要的可以參考下2023-11-11
Go語(yǔ)言并發(fā)處理效率響應(yīng)能力及在現(xiàn)代軟件開(kāi)發(fā)中的重要性
這篇文章主要為大家介紹了Go語(yǔ)言并發(fā)處理的效率及響應(yīng)能力以及在現(xiàn)代軟件開(kāi)發(fā)中的重要性實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03

