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 папку и выберите Ресурс Включает.... Появится диалоговое окно с тем же именем и тремя панелями ввода.

Resourde Включает диалог

  • Сфокусируйтесь на нижней панели под названием директивы времени компиляции: и напишите #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

Другие вопросы по тегам