Python调用Windows API的一个简单例子

Python调用WINDOWS API的方法有多种,本文将使用Python 调用WINDOWS API来获取系统的版本信息。

先来介绍一下获取版本信息的API函数GetVersionExA,该函数在kernell32.dll动态库中。其原型如下:

BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);

POSVERSIONINFO结构如下:

typedef struct {
DWORD dwOSVersionInfoSize;       //在使用GetVersionEx之前要将此初始化为结构的大小
DWORD dwMajorVersion;               //系统主版本号
DWORD dwMinorVersion;               //系统次版本号
DWORD dwBuildNumber;               //系统构建号
DWORD dwPlatformId;                  //系统支持的平台
TCHAR szCSDVersion[128];          //系统补丁包的名称
WORD wServicePackMajor;            //系统补丁包的主版本
WORD wServicePackMinor;            //系统补丁包的次版本
WORD wSuiteMask;                      //标识系统上的程序组
BYTE wProductType;                    //标识系统类型
BYTE wReserved;                         //保留,未使用
} OSVERSIONINFOEX, *POSVERSIONINFOEX

将 POSVERSIONINFO 结构用python表现出来:

import ctypes
 
class POSVERSIONINFO(ctypes.Structure):
    _fields_ = [
        ("dwOSVersionInfoSize",ctypes.c_long),
        ("dwMajorVersion",ctypes.c_long),
        ("dwMinorVersion",ctypes.c_long),
        ("dwBuildNumber",ctypes.c_long),
        ("dwPlatformId",ctypes.c_long),
        ("szCSDVersion",ctypes.c_char*128),
        ("wServicePackMajor",ctypes.c_ushort),
        ("wServicePackMinor",ctypes.c_ushort),
        ("wSuiteMask",ctypes.c_ushort),
        ("wProductType",ctypes.c_byte),
        ("wReserved",ctypes.c_byte)
    ]

对应的数据类型不能错,否则将调用失败。

首先加载kernel32.dll文件,加载dll文件的方法有多种,具体怎么加载取决于DLL编译时的调用约定,此文不对这面进行论述。

kernell32.dll是系统核心文件,导入ctypes时会自动加载,可直接使用。

kernel32 = ctypes.windll.kernel32

返回的是DLL对象,现在可直接用调用方法的方式调用API函数,不过在这之前,需要初始化一下POSVERSIONINFO结构体。

os = POSVERSIONINFO()

再计算结构体大小,并传入dwOSVersionInfoSize:

os.dwOSVersionInfoSize = ctypes.sizeof(os)

结构体初始化完毕,再获得其指针:

os_p = ctypes.byref(os)

开始调用API,GetVersionEx调用成功则返回1,失败则返回0:

if kernel32.GetVersionExA(os_p)==0:
    print("Null")
    exit()

失败则程序退出,成功则可通过下面的方法获得版本信息:

print(os.dwOSVersionInfoSize)
print(os.dwMajorVersion)
print(os.dwMinorVersion)
print(os.dwBuildNumber)
print(os.dwPlatformId)
print(os.szCSDVersion.decode())
print(os.wServicePackMajor)
print(os.wServicePackMinor)
print(os.wSuiteMask)
print(os.wProductType)

完整代码

import ctypes
 
class POSVERSIONINFO(ctypes.Structure):
    _fields_ = [
        ("dwOSVersionInfoSize",ctypes.c_long),
        ("dwMajorVersion",ctypes.c_long),
        ("dwMinorVersion",ctypes.c_long),
        ("dwBuildNumber",ctypes.c_long),
        ("dwPlatformId",ctypes.c_long),
        ("szCSDVersion",ctypes.c_char*128),
        ("wServicePackMajor",ctypes.c_ushort),
        ("wServicePackMinor",ctypes.c_ushort),
        ("wSuiteMask",ctypes.c_ushort),
        ("wProductType",ctypes.c_byte),
        ("wReserved",ctypes.c_byte)
    ]
 
kernel32 = ctypes.windll.kernel32
 
os = POSVERSIONINFO()
 
os.dwOSVersionInfoSize = ctypes.sizeof(os)
 
os_p = ctypes.byref(os)
 
if kernel32.GetVersionExA(os_p)==0:
    print("Null")
    exit()
    
print(os.dwOSVersionInfoSize)
print(os.dwMajorVersion)
print(os.dwMinorVersion)
print(os.dwBuildNumber)
print(os.dwPlatformId)
print(os.szCSDVersion.decode())
print(os.wServicePackMajor)
print(os.wServicePackMinor)
print(os.wSuiteMask)
print(os.wProductType)

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/811.html

分类: 计算机技术
推荐阅读:
python chr()函数 chr() 是 Python 内置函数之一,用于将整数转换为对应的 Unicode 字符。
MySQL ANY_VALUE() 函数 ANY_VALUE()函数对于启用了ONLY_FULL_GROUP_BY模式,使用GROUP BY 进行查询时很有用;该函数用于抑制启用ONLY_FULL_GROUP_BY模式时导致的值拒绝;
OpenSSL1.x和OpenSSL3.x的区别 OpenSSL 1.x和OpenSSL 3.x是两个不同版本的OpenSSL库,其中有很多重要的区别:
使用requests请求后的响应内容 使用Requests进行get请求或post请求后,requests会返回一个Response对象;
使用MATLAB求函数极限 要在 MATLAB 中求解一个函数的极限,可以使用 "limit" 函数。这个函数需要两个输入参数:要求解的函数和趋近于的值。
C语言toupper()函数:将字符转换成大写 toupper()是C语言标准库中的一个函数,用于将一个字符转换成对应的大写形式;如果传入的字符参数是一个小写字母,tolower()函数会返回其对应的大写字母;如果参数不是小写字母,则原封不动的返回;