Если вы предпочитаете не делать это с помощью pywin32, вы наверняка сможете сделать это с помощью ctypes.
Хитрость в том, чтобы декодировать ту глупую структуру версий файлов, которая возвращается.
Есть одна старая запись в списке рассылки , которая делает то, что вы просите. К сожалению, у меня нет коробки с окнами, чтобы проверить это сам, прямо сейчас. Но если это не сработает, это должно как минимум дать вам хорошее начало.
Вот код, если эти архивы 2006 года когда-нибудь исчезнут:
import array
from ctypes import *
def get_file_info(filename, info):
"""
Extract information from a file.
"""
# Get size needed for buffer (0 if no info)
size = windll.version.GetFileVersionInfoSizeA(filename, None)
# If no info in file -> empty string
if not size:
return ''
# Create buffer
res = create_string_buffer(size)
# Load file informations into buffer res
windll.version.GetFileVersionInfoA(filename, None, size, res)
r = c_uint()
l = c_uint()
# Look for codepages
windll.version.VerQueryValueA(res, '\\VarFileInfo\\Translation',
byref(r), byref(l))
# If no codepage -> empty string
if not l.value:
return ''
# Take the first codepage (what else ?)
codepages = array.array('H', string_at(r.value, l.value))
codepage = tuple(codepages[:2].tolist())
# Extract information
windll.version.VerQueryValueA(res, ('\\StringFileInfo\\%04x%04x\\'
+ info) % codepage, byref(r), byref(l))
return string_at(r.value, l.value)
print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion')
-
Ладно - обратно возле окна. На самом деле попробовал этот код сейчас. «У меня работает».
>>> print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion')
6.1.7600.16385 (win7_rtm.090713-1255)