欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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)文章

最新評(píng)論