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

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

03.09.2013, 12:04. Показов 8775. Ответов 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
33411 / 21521 / 8236
Регистрация: 22.10.2011
Сообщений: 36,922
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru