Python ctypes-使用GetVersionEx函数获取0
说明:我正在尝试获取函数GetVersionEx的结果,但我始终在输出中获得“0”:Python ctypes-使用GetVersionEx函数获取0,python,windows,ctypes,Python,Windows,Ctypes,说明:我正在尝试获取函数GetVersionEx的结果,但我始终在输出中获得“0”: class op_info(Structure): _fields_ = [ ('dwOSVersionInfoSize', DWORD), ('dwMajorVersion', DWORD), ('dwMinorVersion', DWORD), ('dwBuildNumber', DWORD), ('dwPlatfor
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函数之前,我做了以下操作:
import sys
op.dwOSVersionInfoSize = sys.getsizeof(op_info)
输出为:452
但是info的最终结果仍然是0下面是一个调用以填充or记录的示例设置
下面是一个调用以填充或记录的示例设置
您正在调用GetVersion而不是。另外,您还没有正确定义结构;szCSDVersion字段应为WCHAR*128数组。您还没有按照文档中的说明设置DWOSVersionInfo字段,例如op.dwosVersionInfo=sizeofop_info。这是必需的,因为GetVersionExW还可以填充更大的结构。@eryksun好的,你说得对,如果我得到它,我会尽力让你知道,谢谢anyway@eryksun我不知道在哪里声明DWOSVersionInfoSize字段的值被分配给实例,而不是声明。您可以重写uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。另外,请注意,调用返回BOOL结果,如果调用失败,该结果将为false。在这种情况下,您可以根据上一个Windows错误引发ctypes.WinError以获取异常。您正在调用GetVersion而不是。另外,您还没有正确定义结构;szCSDVersion字段应为WCHAR*128数组。您还没有按照文档中的说明设置DWOSVersionInfo字段,例如op.dwosVersionInfo=sizeofop_info。这是必需的,因为GetVersionExW还可以填充更大的结构。@eryksun好的,你说得对,如果我得到它,我会尽力让你知道,谢谢anyway@eryksun我不知道在哪里声明DWOSVersionInfoSize字段的值被分配给实例,而不是声明。您可以重写uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。另外,请注意,调用返回BOOL结果,如果调用失败,该结果将为false。在这种情况下,您可以根据上一个Windows错误引发ctypes.WinError以获取异常。
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
if __name__ == '__main__':
print get_os_major_version()