Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
1

Получить версию продукта

03.04.2013, 00:59. Просмотров 1593. Ответов 3
Метки нет (Все метки)

Есть необходимость получить версию файла (exe / dll), которая отображается если в эксполере перейти на вкладку подробнее. Копание в winapi привело к функции
GetFileVersionInfo, вот только как ею пользоваться правильно? Я не знаю как получить информацию о версии полностью, вот что есть:
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
 //определение версии DLL библиотеки
    DWORD  verHandle = NULL;
    UINT   size      = 0;
    LPBYTE lpBuffer  = NULL;
    DWORD  verSize   = GetFileVersionInfoSizeW( activeFile, &verHandle);
 
    if (verSize != NULL)
    {
        LPSTR verData = new char[verSize];
        WCHAR wData[56];
 
        if (GetFileVersionInfo( activeFile, verHandle, verSize, verData))
        {
            if (VerQueryValue(verData,L"\\",(VOID FAR* FAR*)&lpBuffer,&size))
            {
                if (size)
                {
                    VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer;
                    if (verInfo->dwSignature == 0xfeef04bd)
                    {
                        int major = HIWORD(verInfo->dwFileVersionMS);//опред. корректно
                        int minor = LOWORD(verInfo->dwFileVersionMS);//опред. корректно
                        int build = verInfo->dwFileVersionLS; //получается какая-то фигня
                    }
                }
            }
        }
В общем-то проблема с тем чтобы определить остальные составляющие информации о версии файла, первые две составляющие я могу определить, те например версия :
10.1.6200.100
major = 10
minor = 1
а вот как дальше ? В build в моём коде будет какой-то мусор сейчас, а как правильно сделать?

Добавлено через 12 минут
В идеале ещё бы надо было вытянуть информацию о авторских правах и название продукта (всё это в эксполере отображается на вкладке "подробно" при просмотре информации о exe / dll файле). Если кто знает как это сделать то не молчите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 00:59
Ответы с готовыми решениями:

Получить версию ОС
Почему данные не считываются? Выводятся нули. ЧЯДНТ? #pragma once #if...

Как получить Revision версию ОС?
В .NET есть свойство: Environment.OSVersion.Version.Revision На Win7...

SetupDiGetDeviceRegistryProperty имеет unicode версию?
SetupDiGetDeviceRegistryProperty имеет unicode версию? Если в свойствах проекта...

Как задать версию библиотеки
Заранее прошу прощения если разместил тему не там. Суть проблемы. Пишу...

Определить версию компилятора, на котором собиралась программа
Подскажите, попалась одна интересная программка, которая определяет версии...

3
LK
Заблокирован
03.04.2013, 01:27 2
http://netcode.ru/cpp/?lang=&katID=2&skatID=6&artID=28
Получение версии файла
Для получения версии файла в C++Builder воспользуйтесь следующим кодом:
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
DWORD h; 
DWORD Size=GetFileVersionInfoSize(Application->ExeName.c_str(), &h); 
if(Size==0) 
  return ; 
char *buf; 
buf=(char *)GlobalAlloc(GMEM_FIXED, Size); 
if (GetFileVersionInfo(Application->ExeName.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+"\\ProductName").c_str(),&(void         *)ValueBuf,&Len) !=0) 
          AppName->Caption=ValueBuf; 
 
        if (VerQueryValue(buf,AnsiString("\\StringFileInfo\\"+CharSet+"\\FileVersion").c_str(),&(void         *)ValueBuf,&Len)!=0) 
          Version->Caption=ValueBuf; 
 
       if (VerQueryValue(buf,AnsiString("\\StringFileInfo\\"+CharSet+"\\LegalCopyright").c_str(),&(void        *)ValueBuf,&Len)!=0) 
          Copyright->Caption=ValueBuf; 
 
       if (VerQueryValue(buf,AnsiString("\\StringFileInfo\\"+CharSet+"\\CompanyName").c_str(),&(void        *)ValueBuf,&Len)!=0) 
         Company->Caption=ValueBuf; 
      }
  } 
 
GlobalFree(buf);
где AppName, Version, Company - имена компонентов TLabel, которые расположены на вашей форме, и которые отображают полученную информацию.
Это для C++ Builder, но - какая разница.
1
Digit@ll
Brainsbreaker
888 / 366 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
04.04.2013, 01:58 3
Gepar, не верю, что ты не смог найти.
1
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
04.04.2013, 02:04  [ТС] 4
Digit@ll, ну я же не делал запрос по слову VerQueryValue, такой извращённый запрос придумать сложно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 02:04

Как в exe, добавить версию последнего commit из git
Я пока сделал так Есть bat который получает номер коммита, вызывает...

Как вывести версию ядра операционной системы в приложении?
Здравствуйте, подскажет кто-нибудь как вывести версию ядра операционной...

Дана стоимость 100 гр. продукта и сумма. Найти количество продукта в граммах и килограммах.
Задана стоимость 100 гр. продукта и имеющаяся сумма. Найти соответствующее...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru