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相关推荐

  1. C#调用Win32 的API函数--User32.dll

    Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候我们之直接调用Win32 的API,可以很高效的实现想要的效果. using System; ...

  2. Golang通过syscall调用windows dll方法

    为什么80%的码农都做不了架构师?>>>    本用例在GO 1.4.2 上编译执行通过,直接上CODE: package main import ("fmt"& ...

  3. C#调用Win32 api学习总结

    转载:https://blog.csdn.net/bcbobo21cn/article/details/50930221 从.NET平台调用Win32 API Win32 API可以直接控制Micro ...

  4. win32 打印机任务管理的 node 模块 (3)详解Win32 Spooler API 获取打印机列表及状态

    上篇讲了如何写一个 node addon,这篇开始讲述如何调用 Win32 Spooler API 实现打印的完整功能.项目的代码在 https://gitee.com/csling/win32-pr ...

  5. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)...

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  6. 控制台调用win32 API 示例二则

    一 控制台显示消息框 #include <stdio.h> #include <windows.h>int main(int argc, char* argv[]) {int ...

  7. 图解C# 调用Win32 API 示例程序

    一 弹出消息框和发声 先上代码:相关函数不解释:网上比较容易查到: using System; using System.Collections.Generic; using System.Compo ...

  8. java 调用win32 api 学习总结

    java使用JInvoke调用windows API 使用jinvoke调用windowsAPI.jna使用比较麻烦,需要写c代码和参数转换,jinvoke的使用就像jdk中的包一样. 官网使用参考: ...

  9. C# 获取笔记本电池信息 调用 Win32 Api

    C# 获取笔记本电池信息 获取电池信息需要调用Win32 Api 相关函数为 GetSystemPowerStatus 函数结构: BOOL GetSystemPowerStatus(LPSYSTEM ...

最新文章

  1. php soap模块的安装
  2. 华为UPS“内外”兼修
  3. vivado----fpga硬件调试 (五) ----找不到ila核问题及解决
  4. 花马云10亿无作为,被同事骂的当众落泪,后为阿里创造4500亿价值
  5. 逆序创建链表及链表反转和中间位置反转
  6. 分享400多道算法题,来挑战吧
  7. 《智能路由器开发指南》——2.6 参考资料
  8. C++在windows下获得运行主机的硬件信息:CPU序列号、MAC地址、硬盘序列号、主板序列号
  9. MySQL数据备份恢复太慢解决办法
  10. 3D 锥形图表echarts
  11. php随机一句话,PHP简单实现一言 / 随机一句功能
  12. 【jQuery】jQuery 教程
  13. 管理学-“三个和尚”
  14. [VT虚拟化驱动]利用EPT实现无痕HOOK
  15. yolo实现交通信号灯视频流识别代码搬运及调试
  16. 【技术贴】解决打开程序出错,提示错误429,activex部件不能创建对象,不用重装系统。...
  17. Ubuntu上实现蓝牙串口通讯(SPP)
  18. 最系统的网站优化推广大全
  19. 在有滚动条的容器中指定(显示)滚动到某一子元素位置
  20. 窑尾烟室气体分析仪常见故障及处理

热门文章

  1. boost::astar_search用法的测试程序
  2. boost::fusion::hash_value用法的测试程序
  3. DCMTK:“内容映射资源”Content Mapping Resource中的各种CIDxxx和TIDxxx类的测试程序
  4. DCMTK:比较DICOM图像并计算差异指标
  5. c语言求n到m之间的素数和
  6. VTK:Medical之TissueLens
  7. OpenCV遮罩相机的实例(附完整代码)
  8. OpenCV在G-API上移植各向异性图像分割
  9. C++实现堆排序(附完整源码)
  10. QT的QMessageAuthenticationCode类的使用