VC++ 2012: Как включить информацию о версии из version.inc (поддерживается отдельно) в файл.rc
Сводка: определение деталей версии в отдельно поддерживаемом version.inc
через макросы препроцессора... Как включить значения макросов в блок определения версии ресурса?
мой version.inc
Файл хранится в UTF-8 (т.е. в чистом ASCII случае). Его полное содержание следующее (APS_
префикс здесь относится к реальному названию приложения, а не к .aps
файл, сгенерированный компилятором ресурсов):
#define APS_MAJORNUMBER 4
#define APS_MINORNUMBER 5
#define APS_BUILDNUMBER 0
#define APS_MODIFICATIONNUMBER 0
#define APS_BUILDEXT "wx"
#define APS_DATEYEAR 2012
#define APS_DATEMONTH 10
#define APS_DATEDAY 4
Visual Studio 2012 C++, кажется, более требователен к файлу сценария ресурса (app.rc
), чем Visual Studio 2010 была. Первое, что я заметил, это то, что при редактировании вручную я должен сохранить кодировку UTF-16. Вы можете это подтвердить? Есть ли какая-либо документация по этому поводу?
Скажите блок версии в app.rc
выглядит так:
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040504b0"
BEGIN
VALUE "CompanyName", "TODO: <Company name>"
VALUE "FileDescription", "TODO: <File description>"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "app.exe"
VALUE "LegalCopyright", "Copyright (C) 2012"
VALUE "OriginalFilename", "app.exe"
VALUE "ProductName", "TODO: <Product name>"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x405, 1200
END
END
В более ранних версиях Visual Studio (2005 и 2010) я мог иметь связанные version.rc2
как это:
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#include "version.inc"
#define STR(value) #value
#define STRINGIZE(value) STR(value)
#define APS_FULLVERSION_STR \
STRINGIZE(APS_MAJORNUMBER) "." \
STRINGIZE(APS_MINORNUMBER) "." \
STRINGIZE(APS_BUILDNUMBER) "." \
STRINGIZE(APS_MODIFICATIONNUMBER)
VS_VERSION_INFO VERSIONINFO
FILEVERSION APS_MAJORNUMBER,APS_MINORNUMBER,APS_BUILDNUMBER,APS_MODIFICATIONNUMBER
PRODUCTVERSION APS_MAJORNUMBER,APS_MINORNUMBER,APS_BUILDNUMBER,APS_MODIFICATIONNUMBER
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x29L
#else
FILEFLAGS 0x28L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "000004b0"
BEGIN
VALUE "Comments", "A fairly useful tool named APS"
VALUE "CompanyName", "The company name"
VALUE "FileDescription", "app"
VALUE "FileVersion", APS_FULLVERSION_STR
VALUE "InternalName", "aps"
VALUE "LegalCopyright", "Copyright © 1993-" STRINGIZE(APS_DATEYEAR)
VALUE "OriginalFilename", "app.exe"
VALUE "PrivateBuild", ""
VALUE "ProductName", "APS of the version 4"
VALUE "ProductVersion", APS_FULLVERSION_STR
VALUE "SpecialBuild", APS_BUILDEXT
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0, 1200
END
END
Тогда version.rc2
был включен в app.rc
через редактирование app.rc
вручную. Однако я не могу повторить процесс с файлом проекта Visual Studio 2012 и файлом ресурсов. Я могу сделать какую-то ошибку, невидимую для меня. Должен ли этот подход работать и в Visual Studio 2012?
Спасибо за ваше время и опыт,
Petr
1 ответ
Вот способ сделать это через Visual Studio 2012 (C++, IDE). Во-первых, кажется, что все файлы (app.rc
, version.rc2
с разделом версии для включения в app.rc
а такжеversion.inc
значения сохраняются отдельно [включены в version.rc2
]) должен храниться в UTF-16 - в отличие от более ранних версий Visual Studio. Тогда я смог повторить тот же подход и в Visual Studio 2012.
Тем не менее, вам не нужно редактировать app.rc
подать вручную. Вы можете использовать следующие шаги, используя IDE:
- Откройте проект (
App
) и переключитесь на вкладку Resource View. - Развернуть
App
проект, разверни егоapp.rc
и развернитеVersion
папка. Вы можете увидетьVS_VERSION_INFO
вещь. - Отметить
VS_VERSION_INFO
пункт и нажмите клавишу Delete на клавиатуре. Элемент и его верхVersion
папка исчезнет. - Щелкните правой кнопкой мыши
app.rc
папку и выберите Ресурс Включает.... Появится диалоговое окно с тем же именем и тремя панелями ввода.
- Сфокусируйтесь на нижней панели под названием директивы времени компиляции: и напишите
#include "version.rc2"
там. (Файл не должен иметь.rc
расширение, но.rc2
хорошо и рекомендуется в другом месте в документе MSDN.) - Нажмите OK и сохраните все файлы (чтобы сохранить также измененный
app.rc
).
Результатом этих шагов является то, что вы не увидите Version
папка и VS_VERSION_INFO
элемент в дереве ресурсов (см. вкладку Resource View); однако вышеупомянутое построено Version
раздел (хранится внутри version.rc2
) компилируется в ресурсы приложения.
Технически, следующие части app.rc
файл можно найти после шагов:
3 TEXTINCLUDE
BEGIN
"#include ""version.rc2""\r\n"
"\0"
END
...
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#include "version.rc2"
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
Любые конструктивные комментарии для улучшения темы приветствуются и будут добавлены +1.:)
Приятно провести время
Petr