Нашли версию приложения из Python?

1

В основном я пытаюсь выяснить, какая версия ArcGIS установлена ​​пользователем, я просмотрел реестр и не нашел ничего, связанного с версией. Однако я знаю, что он хранится в .exe.

Я немного поработал над поисковой системой и не могу найти ничего действительно достойного. Я попытался использовать GetFileVersionInfo, и я, кажется, получаю случайный беспорядок.

Любые идеи?

ИЗМЕНИТЬ

Вздох....

Выключается. pywin32 не всегда устанавливается на всех машинах. Кто-нибудь знает, возможно ли сделать то же самое через ctypes?

Также это только для окон.

Теги:
winapi

2 ответа

2
Лучший ответ

Если вы предпочитаете не делать этого с помощью 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)
0

есть утилита gnu linux под названием "строки", которая печатает печатаемые символы в любом файле (двоичном или не двоичном), попробуйте использовать это и найдите номер версии, например шаблон

в окнах вы можете получить строки здесь http://unxutils.sourceforge.net/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню