Skip to content
mega-t72 edited this page Sep 14, 2010 · 12 revisions

vc – счетчик версий, это утилита для MSVC, которая в момент компиляции шаблона ресурса парсит и генерирует на его основе rc-файл ( в общем случае, можно генерировать любой текстовый файл ) с актуальной информацией о версии сборки проекта, этот *.rc можно подключить прямо в проект, в качестве дополнительного файла ресурсов, тогда в отличии от большинства аналогичных утит этот ресурс не будет конфликтовать с другими ресурсами проекта

как это работает:

1. подключаем в проект простой текстовый файл, например version.txt
2. пишем в нем нечто вроде такого:


/*%>> Current version: %++qw Current version: %dw.1,%dw.0 Current version: %w.3,%w.2,%w.1,%w.0 Current version: %b.7,%b.6,%b.5,%b.4,%b.3,%b.2,%b.1,%b.0 %<<*/
#define APSTUDIO_READONLY_SYMBOLS
#include “afxres.h”
#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //
WIN32
#endif
/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
FILEVERSION %w.3,%w.2,%w.1,%w.0
PRODUCTVERSION %w.3,%w.2,%w.1,%w.0
FILEFLAGSMASK 0×3fL
#ifdef _DEBUG
FILEFLAGS 0×1L
#else
FILEFLAGS 0×0L
#endif
FILEOS 0×0L
FILETYPE 0×1L
FILESUBTYPE 0×0L
BEGIN
BLOCK “StringFileInfo”
BEGIN
BLOCK “040904E4”
BEGIN
VALUE “CompanyName”, “Company”
VALUE “FileDescription”, “Product”
VALUE “FileVersion”, “%w.3,%w.2,%w.1,%w.0\0”
VALUE “InternalName”, “Product”
VALUE “LegalCopyright”, “Product”
VALUE “OriginalFilename”, “Product.exe”
VALUE “ProductName”, “Product”
VALUE “ProductVersion”, “%w.3,%w.2,%w.1,%w.0\0”
END
END
END

3. Сохраняем, щелкаем на этом файле правой кнопкой мыши в Solution Explorer’е, выбираем Properties
4. Выбираем все конфигурации, ну или Release, кому как удобнее
5. Раскрываем Custom Build Step :: General
6. В Command Line пишем vc “$(InputName).ini” “$(InputFileName)” “$(InputName).rc”
7. В Outputs пишем $(InputName).rc
8. Сохраняем настройки и нажимаем Ctrl + F7 (компиляция ресурса). Если все сделано правильно, то в директории, где лежит этот текстовый файл появятся два дополнительных файла с тем же именем, но с расширениями .ini и .rc
9. Снова открываем Solution Explorer и добавляем в него файл с расширением .rc

Ну вот и все, теперь при каждом билде, этот ресурс будет обновляться в соответствии с новой версией
а чтобы мы это могли наглядно подтвердить, в консоли Output при этом, вы всегда будете наблюдать запись:


Current version: <номер версии в форме 8-и байт>
Current version: <номер версии в форме 4-х слов>
Current version: <номер версии в форме 2-х двойных слов>
Current version: <номер версии в форме учетверенного слова>

это просто пример, на самом деле, вы можете формировать свой вывод и шаблон так, как вам будет сподручнее
спецификация шаблона такая:

% - управляющий символ escape-последовательности, которая всегда заменяется в выходном файле конкретным значением
qw - номер версии (8-байтовое целое в десятичной форме)
%dw.0 - младшее двойное слово версии (4-байтовое целое в десятичной форме)
%dw.1 - старшее двойное слово версии (4-байтовое целое в десятичной форме)
%w.0 - первое слово версии (2-байтовое целое в десятичной форме)
%w.1 - второе слово версии (2-байтовое целое в десятичной форме)
%w.2 - третье слово версии (2-байтовое целое в десятичной форме)
%w.3 - четвертое слово версии (2-байтовое целое в десятичной форме)
%b.0 - первый байт версии (1-байтовое целое в десятичной форме)
%b.1 - второй байт версии (1-байтовое целое в десятичной форме)
%b.2 - третий байт версии (1-байтовое целое в десятичной форме)
%b.3 - четвертый байт версии (1-байтовое целое в десятичной форме)
%b.4 - пятый байт версии (1-байтовое целое в десятичной форме)
%b.5 - шестой байт версии (1-байтовое целое в десятичной форме)
%b.6 - седьмой байт версии (1-байтовое целое в десятичной форме)
%b.7 - восьмой байт версии (1-байтовое целое в десятичной форме)
%>> - открывает режим echo
%<< - закрывает режим echo
%% - экранирование символа %


файл vc.exe перед использованием как у меня в примере, необходимо поместить в какую-нибудь рабочую директорию MSVC, например в $(VSInstallDir)Common7\Tools\, в 9-й версии, обычно это C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools
в младших версиях примерно так же

Кто работает с мастерами (wizard), могут соорудить простенький мастер версий
В моей версии rc.exe двухбайтовые кодировки не поддерживаются, так что конкретно при построении RC, не пользуйтесь флагами -uUe, файл генерируется правильно, даже с BOM’ами, но RC-компилятор просто не заточен на них, не понимает (это удобно в других случаях, например когда вам нужно версию хранить не в VERSIONINFO, а например в текстовом ресурсе, или просто во внешнем файле)

по умолчанию, если флаги не определены, то считается, что вход и выход в кодировке ANSI
вложенные echo наследуются, т.е. обрабатываются как парные скобки (ошибок тут не будет, даже если вы пропустили какую-нибудь скобку, максимум – просто до конца файла вывод будет дублирован в консоли)

Clone this wiki locally