C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как в Caption формы записать версию Build проги
Гость_ripper
Отправлено: 06.06.2003, 12:06


Не зарегистрирован







Как в Caption формы или в AnsiSting записать версию Build проги???
Георгий
Отправлено: 06.06.2003, 13:10


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



где-то в FAQ уже было — вот вырезки из того, что в FAQ:
CODE

AnsiString GetProgramVersion(void)
          {
          AnsiString ret;
          DWORD h;
          DWORD Size=GetFileVersionInfoSize(Application->ExeName.c_str(), &h);
          if(Size==0) return ret;
          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)
                       {
                       ret=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);
   return ret;
          };

ripper
Отправлено: 09.06.2003, 14:05


Ученик-кочегар

Группа: Участник
Сообщений: 5



Спасибо! Буду юзать....
Dmitri
Отправлено: 12.06.2003, 13:16


admin@localhost

Группа: Модератор
Сообщений: 110



Не работает... :/ В чем дело?
Asher
Отправлено: 12.06.2003, 13:37


Мастер участка

Группа: Модератор
Сообщений: 550



НЕ работает — понятие растяжимое biggrin.gif
Что конкретно не работает, как это проявляется?

P.S.: Кстати а этот номер вообще у твоей проги есть?
ты включал Version Info в проект?
Проверь галочку по Project->Options...->Version Info->Include Version Information in Project
Dmitri
Отправлено: 13.06.2003, 10:11


admin@localhost

Группа: Модератор
Сообщений: 110



Галка там стоит. Включаю этот код без изменений в новый проект
CODE

__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
// Здесь этот код
}


А он кричит:
Improper use of typedef 'AnsiString' -> показывает на строку AnsiString GetProgramVersion(void)
Statement missing ; -> сюда же


У кого этот код работает, разместите тут project пустой с этой фичей.
Asher
Отправлено: 13.06.2003, 11:21


Мастер участка

Группа: Модератор
Сообщений: 550



Все правильно. Ругается, будет ругаться и ДОЛЖНА РУГАТЬСЯ!!!
В том варианте что привел Георгий это ФУНКЦИЯ.
ЧТО ОНА ДЕЛАЕТ ВНУТРИ
конструктора формы??? ohmy.gif

Сама функция заполняет Label'ы с именами AppName? Company? CopyRight считанными значениями, плюс возвращает версию программы.
Вытащи ее из конструктора, пожалуйста...
И она покажет на что способна
Dmitri
Отправлено: 13.06.2003, 21:55


admin@localhost

Группа: Модератор
Сообщений: 110



Отдельная функция, билдер кричит: (C++ Error) Unit1.cpp(18): E2206 Illegal character '' (0xa0). Что-то я не понимаю.
Георгий
Отправлено: 13.06.2003, 22:45


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Dmitri
значит что-то не то скопировали.

офирмил как отдельный файл.
инструкции по использованию:
1. Project->add to project — выбираем файл GetProgramVersion.cpp
2. жмём File->Include unit hdr и выбирает GetProgramVersion
3. вызываем
CODE

Application->MessageBox(GetProgramVersion().c_str(),"Как бы версия программы",MB_OK);



User Attached Image Скачать файл
GetProgramVersion.rar


Dmitri
Отправлено: 15.06.2003, 10:51


admin@localhost

Группа: Модератор
Сообщений: 110



Георгий, спасибо Вам за пример! Но как сделать, чтобы показывался build программы, который сам по себе меняется. Версия статична, она не интересна.
Георгий
Отправлено: 15.06.2003, 12:47


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



т.н. "версия" — это полная версия — версия программы.ревизия.релиз.сборка — у меня моя же функция пишет 1.7.22.168

если в настройках проекта стоит галка autoincrement build number, то иногда BCB сам увеличивает номер билда. обычно увеличение номера происходит при полной перекомпиляции проекта.
Dmitri
Отправлено: 19.06.2003, 14:11


admin@localhost

Группа: Модератор
Сообщений: 110



Странно, у меня включена autoincrement build number, но версия статична. Все время выводит 1.0.0.0 sad.gif
Admin
Отправлено: 19.06.2003, 15:02


Владимир

Группа: Администратор
Сообщений: 1190



А у меня в C++Builder6 это называется
Include version information in Project

----

Надо Build проект, а не компилить, тогда увеличивается.
Dmitri
Отправлено: 19.06.2003, 18:25


admin@localhost

Группа: Модератор
Сообщений: 110



OK, последняя цифра в версии 1.0.0.0 меняется, когда я нажимаю Build, но затем нужно заходить в Project -> Options, иначе эта цифра не обновится sad.gif При этом затем я все равно компилирую проект, т.к. exe запустить надо же. Как-то криво получается wink.gif

А средние цифры когда меняются?
Георгий
Отправлено: 19.06.2003, 18:57


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



остальные меняются руками причём действует такое правило:
первым пишется версия програмного пакета частью которого является эта программа
2-м пишется ревизия — изменется на +1 при наличии средних изменений и на +5 при существенных изменениях (но только для тех, которые не изменяют № версии)
3-м пишется число т.н. выпусков программы — это когда процесс исправления ошибок и/или добавления новых функций завершён и есть работоспособная версия программы
4-м — № сборки — фактически единственный линейный параметр — означает число полных перекомпиляций проекта, которые были выполнены из-за изменений исходных текстов.

как видно значения параметров с 1 по 3-й определается на более высоком уровне абстракций, чем те, на которых работает BCB и поэтому это приходится изменять руками.

возможно некоторые WorkFlow позволяют автоматизировать этот процесс, но я о таких не слышал.

А тема — то какая живучая оказалась...
Dmitri
  Отправлено: 19.06.2003, 21:03


admin@localhost

Группа: Модератор
Сообщений: 110



Всем спасибо за объяснения!!!

Вернуться в Вопросы программирования в C++Builder