Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ctypes-使用GetVersionEx函数获取0_Python_Windows_Ctypes - Fatal编程技术网

Python ctypes-使用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

说明:我正在尝试获取函数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函数之前,我做了以下操作:

 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()