2013-07-29 1 views
2

J'ai été surpris de découvrir qu'il n'est apparemment pas possible d'importer des macros prédéfinies C dans les fichiers de ressources (.rc) car le compilateur de ressources n'est pas capable de les traiter.Comment injecter les bonnes informations de version dans les ressources au moment de la compilation?

J'essayais de mettre les informations de version dans un version.h qui serait généré/mis à jour par le système de construction. Ce fichier était supposé être inclus à partir du resource.rc. Lorsque vous générez les ressources, vous obtenez toujours les mêmes versions pour tous les fichiers générés.

Il semble que cela a quelque chose à voir avec RC_INVOKED et ce bug http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc - qui est fermé comme "as-designed".

Comment puis-je résoudre ce problème?

La seule option pour patcher l'exe final afin de mettre à jour les informations de version? ... Je préférerais ne pas faire cela et utiliser un moyen plus standard pour cela.

Répondre

2

Le compilateur de ressources traite parfaitement les définitions d'inclusions et de préprocesseurs. Cela ne fonctionne pas bien avec Windows.h par exemple. Mais je ne peux pas penser à bonne raison pour laquelle vous auriez besoin de cela dans un fichier qui est consommé par le compilateur de ressources. Utilisez simplement un fichier d'en-tête qui n'inclut aucun élément causant l'avertissement, et définissez simplement ce dont vous avez besoin. A titre d'exemple, le versioning typique que nous utilisons ici ce fait et fonctionne très bien: il y a un fichier maître unique .rc avec qui ressemble à quelque chose comme ceci:

#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 

A partir de là les possibilités sont à peu près illimitée. Soit VRC_INCLUDE définir au chemin d'accès complet d'un fichier d'inclusion contenant toutes les définitions VRC_...:

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

ou de fournir toutes les définitions

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

ou une combinaison des deux.

Pour vous montrer les possibilités, voici ce que je fais actuellement pour tous les projets versionnés avec git:

  • chaque projet a un #defining version.h juste un court VRC_FILEDESCRIPTION et VRC_FILEVERSION
  • il y a un maître version.h #defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
  • le projet comprend un fichier .targets qui crée un version.res dans un événement prebuild
  • l'événement prebuild msbuild prend soin des choses intéressantes: i t crée un nouveau fichier d'en-tête temporaire combinant les deux autres, prend le SHA court git et les données actuelles et ajoute que la chaîne de description du fichier pour qu'il finit par ressembler à

    Foo Dll [12e454re 30/07/2013]

+0

Vous avez raison, J'ai manqué que la version.h comprenait un autre .h qui ouvrait la boîte pandora. – sorin

Questions connexes