日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Golang通过syscall调用win32的Api

發(fā)布時間:2024/9/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang通过syscall调用win32的Api 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back.

你所浪費的今天是昨天死去的人奢望的明天; 你所厭惡的現(xiàn)在是未來的你回不去的曾經(jīng)。?

?Golang不是完全的跨平臺, 并沒有提供Windows下的相關(guān)方法,只能通過Syscall包去調(diào)用Win庫。

開始

? ? 如果你不了解Windows下API調(diào)用,請觀看MSDN文檔,我知道有些人找不到,沒關(guān)系:

1.?英文版:?https://msdn.microsoft.com/en-us/library/windows/desktop/hh447209(v=vs.85)

2.?中文版本:http://www.office-cn.net/t/api/api_content.htm

(僅作參考,還有其他中文版本就不一一列舉了)

Golang syscall包

syscall包下面有5個關(guān)于系統(tǒng)調(diào)用的方法,分別表示調(diào)用參數(shù)的個數(shù)。 (golang文檔上可能沒有,請查詢其他文檔或直接在IDE中查看)

func Syscall(trap, nargs, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func Syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) func Syscall9(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) func Syscall12(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2 uintptr, err Errno) func Syscall15(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2 uintptr, err Errno)

第二個參數(shù), nargs 即參數(shù)的個數(shù),一旦傳錯, 輕則調(diào)用失敗,重者直接崩潰 多余的參數(shù), 用0代替。

小實例

? ? 獲取磁盤的空間

package mainimport ("syscall""unsafe""fmt" )func main(){getDiskGreeSpace() }/** 獲取磁盤空間*/ func getDiskGreeSpace(){// 磁盤diskName := "E:"diskNameUtf16Ptr , _:= syscall.UTF16PtrFromString(diskName)// 一下參數(shù)類型需要跟API 的類型相符lpFreeBytesAvailable ,lpTotalNumberOfBytes,lpTotalNumberOfFreeBytes := int64(0),int64(0),int64(0)// 獲取方法引用kernel32 , err := syscall.LoadLibrary("kernel32.dll")if err != nil{panic("獲取方法引用失敗:")}// 釋放引用defer syscall.FreeLibrary(kernel32)getDisFreeSpaceEx , err := syscall.GetProcAddress(kernel32, "GetDiskFreeSpaceExW")if err != nil{panic("失敗1")}// 根據(jù)參數(shù)個數(shù)使用對象SyscallN方法, 只需要4個參數(shù)r , _ , errno := syscall.Syscall6(uintptr(getDisFreeSpaceEx), 4,uintptr(unsafe.Pointer(diskNameUtf16Ptr)), //uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)),0, 0)// 此處的errno不是error接口, 而是type Errno uintptr// MSDN GetDiskFreeSpaceEx function 文檔說明:// Return value// If the function succeeds, the return value is nonzero.// If the function fails, the return value is zero (0). To get extended error information, call GetLastError.// 只要是0 就是錯誤if r!= 0{fmt.Printf("剩余空間 %d M.\n", lpFreeBytesAvailable/1024/1204)fmt.Printf("用戶可用總空間 %d G.\n", lpTotalNumberOfBytes/1024/1204/1024)fmt.Printf("剩余空間2 %d M.\n", lpTotalNumberOfFreeBytes/1024/1204)}else{fmt.Println("失敗2")panic(errno)} }

首先現(xiàn)將MSDN官方的文檔貼出來,方便一下解釋:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85)

BOOL WINAPI GetDiskFreeSpaceEx(_In_opt_??LPCTSTR ????????lpDirectoryName,_Out_opt_?PULARGE_INTEGER lpFreeBytesAvailable,_Out_opt_?PULARGE_INTEGER lpTotalNumberOfBytes,_Out_opt_?PULARGE_INTEGER lpTotalNumberOfFreeBytes );

解釋:

1. 將磁盤的名稱轉(zhuǎn)為*UTF16類型,

?LPCTSTR類型:

L表示long指針?這是為了兼容Windows 3.1等16位操作系統(tǒng)遺留下來的,在win32中以及其他的32位操作系統(tǒng)中, long指針和near指針及far修飾符都是為了兼容的作用。沒有實際意義。

P表示這是一個指針

C表示是一個常量

T表示在Win32環(huán)境中, 有一個_T宏

STR表示這個變量是一個字符串

這是了解一下就好了。

2.? PULARGE_INTEGER?是存儲了64位數(shù)據(jù)的一種類型。

3.?GetProcAddress中GetDiskFreeSpaceExW多了一個W具體是啥意思呢?請留言

簡單記錄一下,要熟悉MSDN?API?文檔可能寫起來順手多了。

?

?

?

?

轉(zhuǎn)載于:https://my.oschina.net/90design/blog/1612390

總結(jié)

以上是生活随笔為你收集整理的Golang通过syscall调用win32的Api的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。