2009-08-12 1 views

ответ

0

Номера версий программ Windows хранятся в разделе ресурсов файла программы, а не в заголовке формата PE. Я не знаком с pefile.py, поэтому я не знаю, обрабатывает ли он непосредственно разделы ресурсов. Если нет, вы сможете найти необходимую информацию для этого в this MSDN article.

0

Предполагая, что «версия исполняемого файла» означает a) в Windows, b) информацию, указанную на вкладке «Свойства», «Сведения», в разделе «Версия файла», вы можете получить ее с помощью пакета pywin32 с помощью следующей команды: :

>>> import win32api as w 
>>> hex(w.GetFileVersionInfo('c:/windows/regedit.exe', '\\')['FileVersionMS']) 
'0x60000' 
>>> hex(w.GetFileVersionInfo('c:/windows/regedit.exe', '\\')['FileVersionLS']) 
'0x17714650' 

Обратите внимание, что 0x60000 имеет основные/незначительные количества (6.0) и 0x17714650 является следующий два, которые, если рассматривать как два отдельных слова (0x1771 и 0x4650 или 6001 и 18000 в десятичной системе) соответствуют значениям на моей машине, где версия regedit 6.0.6001.18000.

+0

Учитывая, что данный модуль не зависит от платформы, но ваш ответ зависит от модуля Win32. Вот почему я решил уменьшить ответ. – 0xC0000022L

+0

0xC0000022L он упоминает pefile.py, но неясно, означает ли он, что это кросс-платформенный. Он ссылается на «.exe», который обычно является Windows. Кроме того, я сказал «предполагая, что вы имеете в виду Windows», поэтому было ясно, что мой ответ не должен был быть кросс-платформенным. Я думаю, что ваш downvote был преждевременным в лучшем случае (до того, как OP выяснит), но что угодно ... –

+0

Модуль 'pefile' сам по себе является кросс-платформенным. – 0xC0000022L

2

Вот пример скрипта, который делает то, что вы хотите:

import sys 

def main(pename): 
    from pefile import PE 
    pe = PE(pename) 
    if not 'VS_FIXEDFILEINFO' in pe.__dict__: 
     print "ERROR: Oops, %s has no version info. Can't continue." % (pename) 
     return 
    if not pe.VS_FIXEDFILEINFO: 
     print "ERROR: VS_FIXEDFILEINFO field not set for %s. Can't continue." % (pename) 
     return 
    verinfo = pe.VS_FIXEDFILEINFO 
    filever = (verinfo.FileVersionMS >> 16, verinfo.FileVersionMS & 0xFFFF, verinfo.FileVersionLS >> 16, verinfo.FileVersionLS & 0xFFFF) 
    prodver = (verinfo.ProductVersionMS >> 16, verinfo.ProductVersionMS & 0xFFFF, verinfo.ProductVersionLS >> 16, verinfo.ProductVersionLS & 0xFFFF) 
    print "Product version: %d.%d.%d.%d" % prodver 
    print "File version: %d.%d.%d.%d" % filever 

if __name__ == '__main__': 
    if len(sys.argv) != 2: 
     sys.stderr.write("ERROR:\n\tSyntax: verinfo <pefile>\n") 
     sys.exit(1) 
    sys.exit(main(sys.argv[1])) 

Соответствующие линии являются:

verinfo = pe.VS_FIXEDFILEINFO 
    filever = (verinfo.FileVersionMS >> 16, verinfo.FileVersionMS & 0xFFFF, verinfo.FileVersionLS >> 16, verinfo.FileVersionLS & 0xFFFF) 
    prodver = (verinfo.ProductVersionMS >> 16, verinfo.ProductVersionMS & 0xFFFF, verinfo.ProductVersionLS >> 16, verinfo.ProductVersionLS & 0xFFFF) 

все из которых происходит только после проверки того, что у нас есть что-то значимое в этих свойствах.

+0

Спасибо C22 очень полезный совет –