golang調(diào)用dll的接口三種方式小結(jié)
1.使用syscall.NewLazyDLL()加載dll,使用接口函數(shù).Call(uintptr類(lèi)型的參數(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類(lèi)型轉(zhuǎn)換為uintptr類(lèi)型的函數(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類(lèi)型轉(zhuǎn)換為uintptr類(lèi)型的函數(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-07Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法
這篇文章主要介紹了Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法,涉及Go語(yǔ)言字符串遍歷與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Golang import 導(dǎo)入包語(yǔ)法及一些特殊用法詳解
這篇文章主要介紹了Golang import 導(dǎo)入包語(yǔ)法及一些特殊用法,需要的朋友可以參考下2020-02-02Go語(yǔ)言定時(shí)任務(wù)cron的設(shè)計(jì)與使用
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中定時(shí)任務(wù)cron的設(shè)計(jì)與使用,文中的示例代碼講解詳細(xì),對(duì)我們深入掌握Go語(yǔ)言有一定的幫助,需要的可以參考下2023-11-11Go語(yǔ)言并發(fā)處理效率響應(yīng)能力及在現(xiàn)代軟件開(kāi)發(fā)中的重要性
這篇文章主要為大家介紹了Go語(yǔ)言并發(fā)處理的效率及響應(yīng)能力以及在現(xiàn)代軟件開(kāi)發(fā)中的重要性實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03