golang調(diào)用windows平臺(tái)的dll庫(kù)的方法實(shí)現(xiàn)
1、dll 和 golang 的編譯架構(gòu)要一直,32位對(duì)應(yīng)32位,64位對(duì)應(yīng)64位,比如如果dll是32位的,而golang是64位的,可能會(huì)報(bào)錯(cuò)%1 is not a valid Win32 application.
2、有時(shí)候存在類型轉(zhuǎn)換,需要開啟CGO,比如,如果dll中的函數(shù)返回一個(gè)字符串,那么返回值是一個(gè)字符串指針,還需要將返回值轉(zhuǎn)換成go字符串
import "C" str := C.GoString((*C.Char)(unsafe.Pointer(ret)))
3、傳入dll函數(shù)的參數(shù)被要求是 uintptr 類型,因此需要做轉(zhuǎn)換。
func IntPtr(n int) uintptr {
return uintptr(n)
}
func Int2IntPtr(n int) uintptr {
return uintptr(unsafe.Pointer(&n))
}
func IntPtr2Ptr(n *int) uintptr {
return uintptr(unsafe.Pointer(n))
}
func BytePtr(s []byte) uintptr {
return uintptr(unsafe.Pointer(&s[0]))
}
func StrPtr(s string) uintptr {
return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}
package main
import (
"fmt"
"syscall"
)
// 設(shè)置console模式下標(biāo)準(zhǔn)輸出的字體前景色
var f = "SetConsoleTextAttribute"
func main() {
f1()
f2()
f3()
f4()
}
func f1() {
// A LazyDLL implements access to a single DLL.
// It will delay the load of the DLL until the first
// call to its Handle method or to one of its
// LazyProc's Addr method.
//
// LazyDLL is subject to the same DLL preloading attacks as documented
// on LoadDLL.
//
// Use LazyDLL in golang.org/x/sys/windows for a secure way to
// load system DLLs.
dll := syscall.NewLazyDLL("kernel32.dll")
p := dll.NewProc(f)
r1, r2, lastError := p.Call(uintptr(syscall.Stdout), uintptr(3))
fmt.Println(r1, r2, lastError)
}
func f2() {
// LoadDLL loads the named DLL file into memory.
//
// If name is not an absolute path and is not a known system DLL used by
// Go, Windows will search for the named DLL in many locations, causing
// potential DLL preloading attacks.
//
// Use LazyDLL in golang.org/x/sys/windows for a secure way to
// load system DLLs.
dll, _ := syscall.LoadDLL("kernel32.dll")
p, _ := dll.FindProc(f)
r1, r2, lastError := p.Call(uintptr(syscall.Stdout), uintptr(4))
fmt.Println(r1, r2, lastError)
}
func f3() {
// MustLoadDLL is like LoadDLL but panics if load operation fails.
dll := syscall.MustLoadDLL("kernel32.dll")
p := dll.MustFindProc(f)
r1, r2, lastError := p.Call(uintptr(syscall.Stdout), uintptr(5))
fmt.Println(r1, r2, lastError)
}
func f4() {
handle, _ := syscall.LoadLibrary("kernel32.dll")
defer syscall.FreeLibrary(handle)
p, _ := syscall.GetProcAddress(handle, f)
r1, r2, errorNo := syscall.Syscall(p, 2, uintptr(syscall.Stdout), uintptr(6), 0)
fmt.Println(r1, r2, errorNo)
// 恢復(fù)到白色
syscall.Syscall(p, 2, uintptr(syscall.Stdout), uintptr(7), 0)
}

到此這篇關(guān)于golang調(diào)用windows平臺(tái)的dll庫(kù)的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang調(diào)用dll庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情
這篇文章主要介紹了Go并發(fā)編程協(xié)程及調(diào)度機(jī)制詳情,協(xié)程是Go語(yǔ)言最大的特色之一,goroutine的實(shí)現(xiàn)其實(shí)是通過(guò)協(xié)程,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09
golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg的處理方法
這篇文章主要介紹了golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg,下面主要介紹Golang 代碼使用方法及Golang PDF轉(zhuǎn)JPEG的詳細(xì)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Go語(yǔ)言使用組合的思想實(shí)現(xiàn)繼承
這篇文章主要為大家詳細(xì)介紹了在 Go 里面如何使用組合的思想實(shí)現(xiàn)“繼承”,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以了解一下2022-12-12
Golang 性能基準(zhǔn)測(cè)試(benchmark)詳解
Golang性能基準(zhǔn)測(cè)試可以幫助開發(fā)人員比較不同的實(shí)現(xiàn)方式對(duì)性能的影響,以便優(yōu)化程序,本文就來(lái)講解一下如何使用Golang的性能基準(zhǔn)測(cè)試功能,需要的朋友可以參考下2023-06-06
Golang利用Template模板動(dòng)態(tài)生成文本
Go語(yǔ)言中的Go?Template是一種用于生成文本輸出的簡(jiǎn)單而強(qiáng)大的模板引擎,它提供了一種靈活的方式來(lái)生成各種格式的文本,下面我們就來(lái)看看具體如何使用Template實(shí)現(xiàn)動(dòng)態(tài)文本生成吧2023-09-09
go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例
本文主要介紹了go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Go 語(yǔ)言入門學(xué)習(xí)之正則表達(dá)式
這篇文章主要介紹了Go 語(yǔ)言入門學(xué)習(xí)之正則表達(dá)式,文章基于GO語(yǔ)言的相關(guān)資料展開詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
go實(shí)現(xiàn)一個(gè)內(nèi)存緩存系統(tǒng)的示例代碼
本文主要介紹了go實(shí)現(xiàn)一個(gè)內(nèi)存緩存系統(tǒng)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10

