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

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

03.09.2013, 12:04. Показов 8651. Ответов 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
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,871
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru