Python ctypes使用GetVersionEx函数获取0

2024-09-26 05:00:27 发布

您现在位置:Python中文网/ 问答频道 /正文

解释:我试图获取函数GetVersionEx的结果,但在输出时始终得到“0”:

class op_info(Structure):
     _fields_ = [
        ('dwOSVersionInfoSize', DWORD),
        ('dwMajorVersion', DWORD),
        ('dwMinorVersion', DWORD),
        ('dwBuildNumber', DWORD),
        ('dwPlatformId', DWORD),
        ('szCSDVersion', DWORD)
     ]

def info():
    op = op_info()
    ctypes.windll.Kernel32.GetVersion(byref(op))
    return op.dwMajorVersion

print info()

问题:如何使此函数工作并获得实际结果?在

编辑:@eryksun我在调用GetVersionExW函数之前执行了此操作:

^{pr2}$

输出为:452

但info()的最终结果仍然是0


Tags: 函数infofieldsdefstructureclassopdword
1条回答
网友
1楼 · 发布于 2024-09-26 05:00:27

下面是一个示例设置,用于调用^{}来填充^{}或{a3}记录。在

import ctypes
from ctypes.wintypes import BYTE, WORD, DWORD, WCHAR

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

class OSVERSIONINFO(ctypes.Structure):
    _fields_ = (('dwOSVersionInfoSize', DWORD),
                ('dwMajorVersion',      DWORD),
                ('dwMinorVersion',      DWORD),
                ('dwBuildNumber',       DWORD),
                ('dwPlatformId',        DWORD),
                ('szCSDVersion',        WCHAR * 128))    
    def __init__(self, *args, **kwds):
        super(OSVERSIONINFO, self).__init__(*args, **kwds)
        self.dwOSVersionInfoSize = ctypes.sizeof(self)
        kernel32.GetVersionExW(ctypes.byref(self))

class OSVERSIONINFOEX(OSVERSIONINFO):
    _fields_ = (('wServicePackMajor', WORD),
                ('wServicePackMinor', WORD),
                ('wSuiteMask',        WORD),
                ('wProductType',      BYTE),
                ('wReserved',         BYTE))

def errcheck_bool(result, func, args):
    if not result:
        raise ctypes.WinError(ctypes.get_last_error())
    return args

kernel32.GetVersionExW.errcheck = errcheck_bool
kernel32.GetVersionExW.argtypes = (ctypes.POINTER(OSVERSIONINFO),)

def get_os_major_version():
    info = OSVERSIONINFO()
    return info.dwMajorVersion
^{pr2}$

相关问题 更多 >