最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang調(diào)用dll的接口三種方式小結(jié)

 更新時(shí)間:2025年07月24日 11:01:33   作者:兩人一城  
本文介紹了在Go語言中使用syscall包的不同方法加載DLL文件,包括NewLazyDLL、MustLoadDLL、LoadLibrary以及它們在調(diào)用函數(shù)和處理不同數(shù)據(jù)類型轉(zhuǎn)換中的應(yīng)用,感興趣的可以了解一下

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)雅退出詳解

    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

    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)方法

    使用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)值

    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 channel死鎖的幾種情況小結(jié)

    Golang channel死鎖的幾種情況小結(jié)

    本文主要介紹了Golang channel死鎖的幾種情況小結(jié),詳細(xì)的介紹了六種情況,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • Golang必知必會(huì)之Go?Mod命令詳解

    Golang必知必會(huì)之Go?Mod命令詳解

    go mod可以使項(xiàng)目從GOPATH的強(qiáng)制依賴中獨(dú)立出來,也就是說你的項(xiàng)目依賴不再需要放在在GOPATH下面了,下面這篇文章主要給大家介紹了關(guān)于Golang必知必會(huì)之Go?Mod命令的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Golang標(biāo)準(zhǔn)庫time包日常用法小結(jié)

    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
  • Golang線程池與協(xié)程池的使用

    Golang線程池與協(xié)程池的使用

    在Golang中,線程池和協(xié)程池是非常常見且重要的概念,它們可以提高應(yīng)用程序的并發(fā)處理能力和性能,減少資源的浪費(fèi),本文就來介紹一下Golang線程池與協(xié)程池的使用,感興趣的可以了解一下
    2024-04-04
  • go modules中replace使用方法

    go modules中replace使用方法

    這篇文章主要為大家介紹了go modules中replace使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 從基礎(chǔ)到高級全方位解析Go中反射的應(yīng)用

    從基礎(chǔ)到高級全方位解析Go中反射的應(yīng)用

    本文我們將全面深入地探討Go語言的反射機(jī)制,從反射的基礎(chǔ)概念、為什么需要反射,到如何在Go中實(shí)現(xiàn)反射,以及在高級編程場景如泛型編程和插件架構(gòu)中的應(yīng)用,需要的可以參考下
    2023-10-10

最新評論

锦屏县| 安仁县| 陆良县| 喜德县| 鸡东县| 岗巴县| 原阳县| 六枝特区| 左权县| 武冈市| 昆明市| 凌海市| 东港市| 康乐县| 富阳市| 寻乌县| 博罗县| 东明县| 根河市| 乌兰察布市| 武山县| 湖北省| 佛山市| 罗江县| 中宁县| 安徽省| 黄浦区| 丰台区| 图木舒克市| 龙海市| 全南县| 江油市| 星子县| 绿春县| 黄梅县| 井陉县| 达孜县| 斗六市| 崇左市| 海口市| 喜德县|