2010-05-28 4 views
2

J'ai une solution, principalement C#, mais avec quelques projets VC++, qui est poussée par notre processus de publication standard (scripts perl et bash sur les boîtes Unix). Actuellement, l'initiative consiste à valider les versions DLL et EXE au cours du processus. Tous les versions sont définies de sorte que la version du fichier soit au format $Id: $ (entre le deux-points et le deuxième dollar doit être un hachage git commit), et la version du produit est au format $Hudson Build: $ (entre le deux-points et le second dollar devrait être un chaîne représentant les détails de construction de hudson).Comment faire pour valider Windows VC++ DLL sur les systèmes Unix

Actuellement, ce système fonctionne très bien pour les projets C# parce que cette information de version est stockée sous forme de chaînes simples dans le code compilé (vous pouvez littéralement utiliser la commande unix strings et voir les informations de version); le problème est que les projets VC++ n'exposent pas ces informations sous forme de chaînes (j'ai utilisé un système Windows pour vérifier que les informations de version sont correctement définies), donc je ne sais pas comment extraire la version sur un système Unix. Des suggestions pour A) Obtenir une représentation sous forme de chaîne de la version intégrée dans le code compilé, ou B) Un utilitaire/script qui peut extraire cette information?

Répondre

1

Les informations de version pour le code compilé de manière native sous Windows sont stockées en UTF-16, c'est-à-dire des chaînes étendues, dans le binaire. Vous pouvez toujours utiliser la commande strings, mais vous devez lui indiquer de rechercher des chaînes étendues avant de les trouver, en utilisant l'option -e l. Par exemple, sur mon système, RMB> Properties sur C: \ Windows \ notepad.exe donne la version du fichier 5.1.2600.5512 (xpsp.080413-2105).Je l'ai copié à une boîte Linux, et comme vous le dites, strings ne trouve pas avec les drapeaux par défaut

$ strings notepad.exe | grep xpsp 
$ 

mais si vous définissez l'encodage il sort bien:

$ strings -e l notepad.exe | grep xpsp 
5.1.2600.5512 (xpsp.080413-2105) 
+0

Ooh, je suis content que je n'ai pas eu le temps de faire d'autres travaux sur ce premier! Merci pour la solution simple. – Guildencrantz

1

En supposant que vous ayez un accesseur dans votre DLL pour les informations que vous devez vérifier, vous pouvez écrire un petit programme qui s'exécute sous wine et fournit les informations nécessaires à la sortie standard. Un tel exemple de programme est disponible sous la rubrique dynamic link library sur Wikipedia.

Une autre option consiste à comprendre comment MSVC++ est en train de coder ces informations afin de pouvoir les décoder ou les interroger avec des outils Unix standard.

+1

que je recherchais à l'option du vin, malheureusement ce n'est pas faisable. Décoder l'information est, malheureusement, la noix que je pense devoir craquer. – Guildencrantz

1

Les exécutables Windows et les bibliothèques partagées (DLL) codent les informations de version en tant que données binaires (VERSIONINFO) dans la section resources.

Jetez un oeil à this question pour voir les API Win32 qui peuvent être utilisés pour interroger les informations de version. Bien que vous ayez besoin de faire un petit changement à ce code. Les API FindResource et LoadResource doivent être passées dans le descripteur au fichier EXE/DLL (déjà chargé en mémoire) dont vous souhaitez obtenir les informations de version. Passer en NULL obtient les informations de version associées à l'EXE à partir duquel ce code est appelé (ce n'est pas ce que vous voulez).

Vous devez appeler LoadLibrary pour charger un fichier EXE ou DLL sur le disque et obtenir son handle puis passer ce handle aux fonctions API mentionnées ci-dessus comme paramètre hModule. Et peut-être aussi imprimer les informations nécessaires à la console après avoir obtenu le VERSIONINFO requis.

0

Toute raison pour laquelle vous ne pouvez pas simplement utiliser une chaîne contenant $Id: $ - comme ceci:

const char version[] = "$Id: $" 

Bien sûr, vous avez les ID de version à deux endroits, mais ils sont chassés de la même source .

+0

Mon msOO build est faible (c'est sur VS2008, où les fichiers vcproj ne sont pas vraiment des projets msbuild), donc le problème est de savoir comment développer $ Id: $ 'au hash de commit au moment de la construction. – Guildencrantz

+0

Mon Git-fu est faible, mais VS2008 a une commande de pré-construction qui vous permettrait d'exécuter un exécutable qui étendrait les IDs au hachage de validation. La deuxième question est de demander comment les ressources VERSIONINFO sont construites en premier lieu. –

Questions connexes