Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/41: Рейтинг темы: голосов - 41, средняя оценка - 4.56
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151

Получить версию любого .exe файла

03.09.2013, 12:04. Показов 8725. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.
Давно уже видел в интернете много вопросов на эту тему, поэтому когда мне понадобилось получать версию любого exe файла,
я нашел большой код, подогнал его под себя и решил дать вам в виде функции, пользуйтесь:

1. В Unit1.h в разделе public вставляете:
C++
1
AnsiString __fastcall GetVer(AnsiString FileName);
2. В Unit1.cpp пишем функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
AnsiString __fastcall TMainForm::GetVer(AnsiString FileName)
{
        AnsiString Version;
        DWORD h;
        DWORD Size = GetFileVersionInfoSize(FileName.c_str(), &h);
        if(Size == 0)
        {
                Version = "íåèçâåñòíî";
                return Version;
        }
        char *buf;
        buf = (char *)GlobalAlloc(GMEM_FIXED, Size);
        if(GetFileVersionInfo(FileName.c_str(), h, Size, buf)!=0)
        {
                char *ValueBuf; UINT Len; VerQueryValue(buf, "\\VarFileInfo\\Translation", &(void *)ValueBuf,&Len);
                if(Len>=4)
                {
                        AnsiString CharSet=IntToHex((int )MAKELONG(*(int *)(ValueBuf + 2), *(int *)ValueBuf), 8);
                        if(VerQueryValue(buf, AnsiString("\\StringFileInfo\\"+CharSet+"\\FileVersion").c_str(), &(void *)ValueBuf, &Len) != 0)
                                Version = ValueBuf;
                }
        }
GlobalFree(buf);
return Version;
}
3. Входным параметром является имя exe файла, если он в папке с вашим приложением. В противном случае указываем полный путь, где вместо одного обратного слэша "\"пишем 2 "\\":
C++
1
Label1->Caption=GetVer("proga.exe");
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.09.2013, 12:04
Ответы с готовыми решениями:

Выставить версию exe файла
Всем привет! Уважаемые программисты, подскажите как в microsoft visual studio 2017 в разрабатываемом консольном приложении выставлять...

как узнать версию exe файла
Все привет! как программно узнать версию чужой программы , а точнее exe файла

Написать AES, шифрования любого файла .exe.
Есть задача написать AES, который будет зашифровывать и расшифровывать любой файл .exe. Как лучше открывать этот файл, если нужно считывать...

10
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
16.01.2014, 12:50  [ТС]
Для Rad Studio функция будет выглядеть следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
String __fastcall TMainForm::GetVer(String FileName)
{
    AnsiString Version;
    DWORD h;
    DWORD Size = GetFileVersionInfoSize(FileName.c_str(), &h);
    if(Size == 0)
    {
        Version = "неизвестно";
        return Version;
    }
    char *buf;
    buf = (char *)GlobalAlloc(GMEM_FIXED, Size);
    if(GetFileVersionInfo(FileName.c_str(), h, Size, buf)!=0)
    {
        char *ValueBuf; UINT Len; VerQueryValue(buf, L"\\VarFileInfo\\Translation", &(void *)ValueBuf,&Len);
        if(Len>=4)
        {
            String CharSet=IntToHex((int )MAKELONG(*(int *)(ValueBuf + 2), *(int *)ValueBuf), 8);
            if(VerQueryValue(buf, String("\\StringFileInfo\\"+CharSet+"\\FileVersion").c_str(), &(void *)ValueBuf, &Len) != 0)
                Version = ValueBuf;
        }
    }
    GlobalFree(buf);
    return Version;
}
Объявляем:
C++
1
String __fastcall GetVer(String FileName);
Это при условии, что в опциях проекта параметр _TCHAR maps to имеет значение wchar_t.

Добавлено через 10 минут
Однако на XE3 данная функция почему-то выдает только первую цифру версии файла... Может кто-то подскажет в чем может быть причина?
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
22.01.2014, 11:25  [ТС]
Ребят, ну может кто-нибудь поможет? Мне реально на XE3 надо заставить эту функцию показывать версию нормально...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
22.01.2014, 12:30
Цитата Сообщение от Alexell Посмотреть сообщение
Может кто-то подскажет в чем может быть причина?
Ну явно где-то нестыковка однобитных и двубитных символов. ()

Добавлено через 1 минуту
Сходу попробуйте char заменить везде на TCHAR. Пусть XE сам разбирается.

Добавлено через 27 минут
На выбор:

Анси:
C++
15
VerQueryValueA(buf, "\\VarFileInfo\\Translation", &(void *)ValueBuf,&Len);
Юникод:
C++
15
VerQueryValueW(buf, L"\\VarFileInfo\\Translation", &(void *)ValueBuf,&Len);
Авто:
C++
15
VerQueryValue(buf, (TCHAR*)"\\VarFileInfo\\Translation", &(void *)ValueBuf,&Len);
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
22.01.2014, 12:37  [ТС]
Ничего не трогал, только менял указанную вами строчку:
Первый вариант вывел лишь единицу
Второй вариант тоже вывел единицу
Третий вариант ничего не вывел.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
22.01.2014, 15:01
С юникодом что-то не хочет работать в XE.

Поправил только вот это место - принудительно через анси ( AnsiString и VerQueryValueA ):
C++
1
2
3
4
5
6
7
8
//
            AnsiString lpSubBlock = String("\\StringFileInfo\\"+CharSet+"\\FileVersion");
            if( VerQueryValueA( buf,
                               lpSubBlock.c_str(),
                               &(void *)ValueBuf,
                               &Len )
               )
               Version = ValueBuf;
Полный код функции для XE
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
String __fastcall TForm1::GetVer(String FileName)
{
    AnsiString Version;
    DWORD h;
    DWORD Size = GetFileVersionInfoSize(FileName.c_str(), &h);
    if(Size == 0)
    {
        Version = "неизвестно";
        return Version;
    }
    char *buf;
    buf = (char *)GlobalAlloc(GMEM_FIXED, Size);
    if(GetFileVersionInfo(FileName.c_str(), h, Size, buf)!=0)
    {
        char *ValueBuf;
        UINT Len;
        VerQueryValue(buf, L"\\VarFileInfo\\Translation", &(void *)ValueBuf, &Len);
        if(Len>=4)
        {
            String CharSet = IntToHex((int )MAKELONG(*(int *)(ValueBuf + 2), *(int *)ValueBuf), 8);
            AnsiString lpSubBlock = String("\\StringFileInfo\\"+CharSet+"\\FileVersion");
            if( VerQueryValueA( buf,
                               lpSubBlock.c_str(),
                               &(void *)ValueBuf,
                               &Len )
               )
               Version = ValueBuf;
        }
    }
    GlobalFree(buf);
    return Version;
}
2
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
22.01.2014, 15:04  [ТС]
SatanaXIII, афигеть, спасибо огромнейшее-преогромнейшее!!! Прям даже не знаю как вас благодарить)) Осталась лишь мелочь: убрать пробелы и поменять запятые на точки, я это уже делал на билдере шестом)))
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
22.01.2014, 15:12
Цитата Сообщение от Alexell Посмотреть сообщение
не знаю как вас благодарить
Я знаю - постарайтесь не писать больше вот такую какашку:
C++
1
char *ValueBuf; UINT Len; VerQueryValue(buf, L"\\VarFileInfo\\Translation", &(void *)ValueBuf,&Len);

Пишите три разные строки. Чтобы читать приятно было. И до кучи условие в if-е посмотрите как я например оформил.
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
22.01.2014, 15:19  [ТС]
Окей, спасибо))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
22.01.2014, 15:25
Alexell, а что,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
String __fastcall TForm1::GetVer(String FileName)
{
    String Version;
    DWORD h;
    DWORD Size = GetFileVersionInfoSize(FileName.c_str(), &h);
    if (Size == 0)
    {
        Version = L"неизвестно";
        return Version;
    }
 
    TCHAR *buf;
    buf = (TCHAR *)GlobalAlloc(GMEM_FIXED, Size);
    if (GetFileVersionInfo(FileName.c_str(), h, Size, buf) != 0)
    {
        PVSFixedFileInfo ValueBuf;
        UINT Len;
        if (VerQueryValue(buf, L"\\", &(void *)ValueBuf, &Len) != 0)
            Version = String().sprintf(L"%d.%d.%d.%d",
            HIWORD(ValueBuf->dwFileVersionMS),
            LOWORD(ValueBuf->dwFileVersionMS),
            HIWORD(ValueBuf->dwFileVersionLS),
            LOWORD(ValueBuf->dwFileVersionLS));
    }
    GlobalFree(buf);
    return Version;
}
- это уже слишком просто?
5
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
22.01.2014, 15:33  [ТС]
UI, та функция, что я представил, я нашел ее где-то в другом неудобном виде, сделал функцией и что-то еще вроде бы поправил, но я в ней не разбираюсь, чтобы понять, что там как устроено.
Запятые на точки я менял уже на готовом результате с помощью StringReplace.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2014, 15:33
Помогаю со студенческими работами здесь

Получить версию файла
Application.ProductVersion показывает версию в виде 0.0.5.7, а мне нужно получитьвесию без точек то есть в виде 0057.

Получить версию файла *.dll
в файле ресурсов скомпилировал dll и указал ей версию типа 1.0 как в коде c++ определить что мы используем нужную версию библиотеки, а в...

Ошибка при открытии любого приложения вследствие удаления файла StormII.exe
Антивирус обнаружил процесс StormII.exe и удалили его. Из за него невероятно тормозил компьютер,но после его удаления при попытке открыть...

Получить версию билда ехе-файла
Надо узнать и сравнить версии билда ехе файла, чтобы после каждого изменения не скидывать самому ехе тестировщикам, а сравнив, если новая...

Как получить версию и дату создания war файла, созданного с помощью Run Ant?
Kak poluchit(ili prochitat) versiju ili Datu sosdanija war-file, sosdannogo s pomoshju Run Ant? Kak mozhno etu informaziju dostavit s...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru