Golang通过syscall调用win32的Api
2019獨角獸企業重金招聘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.
你所浪費的今天是昨天死去的人奢望的明天; 你所厭惡的現在是未來的你回不去的曾經。?
?Golang不是完全的跨平臺, 并沒有提供Windows下的相關方法,只能通過Syscall包去調用Win庫。
開始
? ? 如果你不了解Windows下API調用,請觀看MSDN文檔,我知道有些人找不到,沒關系:
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個關于系統調用的方法,分別表示調用參數的個數。 (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)第二個參數, nargs 即參數的個數,一旦傳錯, 輕則調用失敗,重者直接崩潰 多余的參數, 用0代替。
小實例
? ? 獲取磁盤的空間
package mainimport ("syscall""unsafe""fmt" )func main(){getDiskGreeSpace() }/** 獲取磁盤空間*/ func getDiskGreeSpace(){// 磁盤diskName := "E:"diskNameUtf16Ptr , _:= syscall.UTF16PtrFromString(diskName)// 一下參數類型需要跟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")}// 根據參數個數使用對象SyscallN方法, 只需要4個參數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)} }首先現將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. 將磁盤的名稱轉為*UTF16類型,
?LPCTSTR類型:
L表示long指針?這是為了兼容Windows 3.1等16位操作系統遺留下來的,在win32中以及其他的32位操作系統中, long指針和near指針及far修飾符都是為了兼容的作用。沒有實際意義。
P表示這是一個指針
C表示是一個常量
T表示在Win32環境中, 有一個_T宏
STR表示這個變量是一個字符串
這是了解一下就好了。
2.? PULARGE_INTEGER?是存儲了64位數據的一種類型。
3.?GetProcAddress中GetDiskFreeSpaceExW多了一個W具體是啥意思呢?請留言
簡單記錄一下,要熟悉MSDN?API?文檔可能寫起來順手多了。
?
?
?
?
轉載于:https://my.oschina.net/90design/blog/1612390
總結
以上是生活随笔為你收集整理的Golang通过syscall调用win32的Api的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHPer面试指南-前言
- 下一篇: Server 2008 配置共享文件服务