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?

Спасибо за ваше время и опыт,

Петр


person pepr    schedule 10.10.2012    source источник


Ответы (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) и перейдите на вкладку Просмотр ресурсов.
  • Разверните проект 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 в дереве ресурсов (см. вкладку Просмотр ресурсов); однако упомянутый выше сконструированный раздел 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 :)

Приятно провести время,

Петр

person pepr    schedule 12.10.2012
comment
Самая важная часть заключается в том, что файлы ресурсов и заголовки должны быть в кодировке UTF-16. Это безумное ограничение для нового RC-компилятора, которое мне кажется ошибкой. - person philk; 23.01.2014
comment
Спасибо. Это странно. Вы только что сэкономили мне немного времени. - person dyasta; 25.10.2014
comment
Пожалуйста. Просто любопытно, вы пробовали это с Visual Studio 2012 или с более новой (VS2013 или кандидат VS2014)? - person pepr; 25.10.2014