Comment valider la DLL Windows VC ++ sur les systèmes Unix

J’ai une solution, la plupart du temps en C #, mais avec quelques projets VC ++, notre processus de publication standard (scripts perl et bash sur les boîtes Unix) est mis en avant. Actuellement, l’initiative consiste à valider les versions DLL et EXE à mesure qu’elles passent par le processus. Tout le contrôle de version est défini pour que la version de fichier soit au format $Id: $ (entre les deux-points et le deuxième dollar doit être un hachage de validation git) et la version du produit est au format $Hudson Build: $ (entre deux points et le deuxième dollar devrait être une chaîne représentant les détails de la construction hudson).

Actuellement, ce système fonctionne extrêmement bien pour les projets C # car ces informations de version sont stockées sous forme de chaînes simples dans le code compilé (vous pouvez littéralement utiliser la commande unix ssortingngs 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?

Les informations de version du code compilé en natif sur Windows sont stockées dans UTF-16, c’est-à-dire des chaînes étendues, dans le binary. Vous pouvez toujours utiliser la commande ssortingngs , mais vous devez lui indiquer de rechercher les chaînes larges avant de les trouver, en utilisant l’option -el .

Par exemple, sur mon système, RMB> Propriétés sur C: \ Windows \ notepad.exe donne la version du fichier sous la forme 5.1.2600.5512 (xpsp.080413-2105) . Je l’ai copié dans une boîte Linux, et comme vous le dites, les ssortingngs ne le trouvent pas avec les drapeaux par défaut

 $ ssortingngs notepad.exe | grep xpsp $ 

mais si vous définissez l’encodage, il sortira bien:

 $ ssortingngs -el notepad.exe | grep xpsp 5.1.2600.5512 (xpsp.080413-2105) 

En supposant que vous ayez un accesseur dans votre DLL pour les informations à vérifier, vous pouvez écrire un petit programme qui s’exécute sous wine et afficher les informations nécessaires sur la sortie standard. Un exemple de programme est disponible sous la bibliothèque de liens dynamics sur Wikipedia.

Une autre option consiste à déterminer comment MSVC ++ encodera ces informations pour que vous puissiez les décoder ou les interroger avec des outils unix standard.

Les exécutables Windows et les bibliothèques partagées (DLL) encodent les informations de version sous forme de données binarys ( VERSIONINFO ) dans la section des ressources .

Jetez un oeil à cette question pour voir les API win32 qui peuvent être utilisées pour interroger les informations de version. Bien que vous deviez apporter une petite modification à ce code. Les API FindResource et LoadResource doivent être transmises dans le descripteur à la DLL / EXE (déjà chargée en mémoire) dont vous souhaitez obtenir les informations de version. Passer en NULL permet d’obtenir les informations de version associées à l’EXE d’où 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 descripteur, puis transmettre ce descripteur aux fonctions API susmentionnées en tant que paramètre hModule. Et peut être aussi imprimer les informations requirejses pour consoler après avoir obtenu la version VERSIONINFO requirejse.

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 identifiants de version à deux endroits, mais ils proviennent de la même source.