21 votes

Afficher le timbre de compilation à l'exécution dans un exécutable Visual C++?

Comment puis-je insérer des informations de date et d'heure de compilation dans un exécutable que je construis avec Visual C++ 2005? Je veux pouvoir afficher quelque chose comme ceci lorsque j'exécute le programme:

Ce build XXXX a été compilé le dd-mm-yy, hh:mm.

où la date et l'heure reflètent le moment où le projet a été construit. Ils ne devraient pas changer à chaque appel successif du programme, à moins qu'il ne soit recompilé.

28voto

Jim Buck Points 10839

Bien que ce ne soit pas votre format exact, DATE sera au format Mmm dd yyyy, tandis que TIME sera au format hh:mm:ss. Vous pouvez créer une chaîne comme celle-ci et l'utiliser dans n'importe quelle routine d'impression qui vous convient :

const char *buildString = "Cette version XXXX a été compilée le " __DATE__ ", " __TIME__ ".";

(Remarque sur une autre réponse : TIMESTAMP ne renvoie que la date/heure de modification du fichier source, pas la date/heure de compilation.)

12voto

sparkes Points 10192
__DATE__ 
__TIME__

sont prédéfinis dans le cadre des normes de C99 et devraient être disponibles pour vous. Ils s'exécutent une fois avec le préprocesseur.

8voto

Mat Noguchi Points 851

Eh bien... pour Visual C++, il y a un symbole intégré appelé __ImageBase. Plus précisément :

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

Vous pouvez inspecter cela à l'exécution pour déterminer l'horodatage dans l'en-tête PE :

const IMAGE_NT_HEADERS *nt_header= (const IMAGE_NT_HEADERS *)((char *)&__ImageBase + __ImageBase.e_lfanew);

Et utilisez nt_header->FileHeader.TimeDateStamp pour obtenir l'horodatage, qui est en secondes depuis le 1/1/1970.

6voto

Joe Schneider Points 3563

__TIME__ et __DATE__ peuvent fonctionner, cependant il y a quelques complications.

Si vous placez ces définitions dans un fichier .h, et incluez les définitions de plusieurs fichiers .c/.cpp, chaque fichier aura une version différente de la date/heure en fonction de quand il est compilé. Donc si vous cherchez à utiliser la date/heure en deux endroits différents et qu'ils doivent toujours correspondre, vous êtes en difficulté. Si vous effectuez une construction progressive, l'un des fichiers peut être reconstruit tandis que l'autre ne l'est pas, ce qui se traduit à nouveau par des horodatages qui pourraient être très différents.

Une approche légèrement meilleure est de faire des prototypes GetBuildTimeStamp() dans un fichier .h, et de mettre les macros __TIME__ et __DATE__ dans le fichier d'implémentation (.c/.cpp). De cette façon, vous pouvez utiliser les horodatages à plusieurs endroits dans votre code et ils correspondront toujours. Cependant, vous devez vous assurer que le fichier .c/.cpp est reconstruit à chaque fois qu'une construction est effectuée. Si vous faites des constructions propres, alors cette solution peut fonctionner pour vous.

Si vous effectuez des constructions progressives, alors vous devez vous assurer que le tampon de construction est mis à jour à chaque construction. En Visual C++, vous pouvez le faire avec des étapes PreBuild - cependant dans ce cas, je vous recommande plutôt d'utiliser un fichier basé sur du texte qui est lu au moment de l'exécution de votre programme au lieu d'utiliser __DATE__ et __TIME__ dans un fichier .c/.cpp compilé. Cela permet à votre script de construction de mettre à jour rapidement le tampon (pas de compilation ou de liaison requise) et ne nécessite pas que votre étape PreBuild comprenne vos drapeaux ou options de compilateur.

1voto

HS. Points 1960

Je pense que les solutions suggérées d'utiliser DATE, TIME ou TIMESTAMP seraient assez bonnes. Je recommande d'obtenir un programme de toucher pour l'inclure dans une étape de pré-construction afin de toucher le fichier qui utilise la variable du préprocesseur. Toucher un fichier s'assure que son horodatage est plus récent qu'au moment de sa dernière compilation. De cette façon, la date/heure dans le fichier compilé est également modifiée à chaque reconstruction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X