Golang通过syscall调用win32的Api
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back.
你所浪費(fèi)的今天是昨天死去的人奢望的明天; 你所厭惡的現(xiàn)在是未來的你回不去的曾經(jīng)。?
?Golang不是完全的跨平臺(tái), 并沒有提供Windows下的相關(guān)方法,只能通過Syscall包去調(diào)用Win庫。
開始
? ? 如果你不了解Windows下API調(diào)用,請(qǐng)觀看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個(gè)關(guān)于系統(tǒng)調(diào)用的方法,分別表示調(diào)用參數(shù)的個(gè)數(shù)。 (golang文檔上可能沒有,請(qǐng)查詢其他文檔或直接在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)第二個(gè)參數(shù), nargs 即參數(shù)的個(gè)數(shù),一旦傳錯(cuò), 輕則調(diào)用失敗,重者直接崩潰 多余的參數(shù), 用0代替。
小實(shí)例
? ? 獲取磁盤的空間
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ù)個(gè)數(shù)使用對(duì)象SyscallN方法, 只需要4個(gè)參數(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 就是錯(cuò)誤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修飾符都是為了兼容的作用。沒有實(shí)際意義。
P表示這是一個(gè)指針
C表示是一個(gè)常量
T表示在Win32環(huán)境中, 有一個(gè)_T宏
STR表示這個(gè)變量是一個(gè)字符串
這是了解一下就好了。
2.? PULARGE_INTEGER?是存儲(chǔ)了64位數(shù)據(jù)的一種類型。
3.?GetProcAddress中GetDiskFreeSpaceExW多了一個(gè)W具體是啥意思呢?請(qǐng)留言
簡單記錄一下,要熟悉MSDN?API?文檔可能寫起來順手多了。
?
?
?
?
轉(zhuǎn)載于:https://my.oschina.net/90design/blog/1612390
總結(jié)
以上是生活随笔為你收集整理的Golang通过syscall调用win32的Api的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHPer面试指南-前言
- 下一篇: Server 2008 配置共享文件服务