2013-07-29 3 views
2

Я был удивлен, обнаружив, что, по-видимому, невозможно импортировать предопределенные макросы C внутри файлов ресурсов (.rc), потому что Resource Compiler не справляется с ними.Как ввести правильную информацию о версии в ресурсы во время компиляции?

Я пытался разместить информацию о версии внутри version.h, которая будет сгенерирована/обновлена ​​системой сборки. Этот файл должен был быть включен из resource.rc, поэтому, когда вы создаете ресурсы, вы всегда будете получать одинаковые версии во всех встроенных файлах.

Кажется, что это как-то связано с RC_INVOKED и этой ошибкой http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc - которая закрыта как «как запроектированная».

Как я могу решить эту проблему?

Является единственным вариантом для исправления окончательной версии exe, чтобы обновить информацию о версии? ... Я бы предпочел не делать этого и использовать для этого более стандартный способ.

ответ

2

Компилятор ресурсов отлично разбирается с определениями и определениями препроцессора. Это просто плохо справляется с Windows.h, например. Но я не могу думать о любой хорошей причиной, почему вам нужно, что в файле, который потребляется компилятором ресурсов. Просто используйте заголовочный файл, который не содержит ничего, вызывающего предупреждение, и просто определите, что вам нужно. В качестве примера типичных версий мы используем здесь делает это и работает отлично: есть одного мастер .rc файл с, который выглядит примерно так:

#include <winver.h> 

#define stringize(x)  stringizei(x) 
#define stringizei(x)  #x 

#ifdef VRC_INCLUDE 
    #include stringize(VRC_INCLUDE) 
#endif 

#ifdef _WIN32 
    LANGUAGE 0x9,0x1 
    #pragma code_page(1252) 
#endif 

1 VERSIONINFO 
FILEVERSION VRC_FILEVERSION 
PRODUCTVERSION VRC_PRODUCTVERSION 
FILEFLAGSMASK 0x1L 
FILEFLAGS  VS_FF_DEBUG 
FILEOS   VOS__WINDOWS32 
FILETYPE  VRC_FILETYPE 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
    BLOCK "040904E4" 
    BEGIN 
     VALUE "CompanyName",  stringize(VRC_COMPANYNAME) 
     VALUE "FileDescription", stringize(VRC_FILEDESCRIPTION) 
     VALUE "FileVersion",  stringize(VRC_FILEVERSION) 
     VALUE "LegalCopyright", stringize(VRC_COPYRIGHT) 
     VALUE "InternalName",  stringize(VRC_ORIGINALFILENAME) 
     VALUE "OriginalFilename", stringize(VRC_ORIGINALFILENAME) 
     VALUE "ProductName",  stringize(VRC_PRODUCTNAME) 
     VALUE "ProductVersion", stringize(VRC_PRODUCTVERSION) 
    END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
    VALUE "Translation", 0x409, 1200 
    END 
END 

Отсюда по возможности в значительной степени неограничен. Либо определить VRC_INCLUDE к полному пути включаемого файла, содержащего все VRC_... определения:

rc /d VRC_INCLUDE=$(VersionMainInclude) ... version.rc

или поставить все определения

rc /d VRC_COMPANYNAME=mycompany ... version.rc

или комбинация обоих.

Чтобы показать вам возможности, вот что я сейчас делаю для всех проектов версионированных с мерзавцем:

  • каждый проект имеет version.h #defining только короткий VRC_FILEDESCRIPTION и VRC_FILEVERSION
  • есть мастер version.h #defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
  • проект включает в себя файл .targets, который создает version.res в виде prebuild события
  • событие MSBuild prebuild заботится о интересных вещах: я т создает новый временный файл заголовка, сочетающий два другие, занимает короткую GIT SHA и текущие данные и добавляет, что для описания файла строки, так что в конечном итоге выглядят как

    Foo Dll [12e454re 30/07/2013]

+0

Вы правы, Я пропустил, что версия.h включала еще один .h, который открывал ящик pandora. – sorin