Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 25-11-2011 10:55:05

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

[OUTIL] Lib et Plugin NSIS compatibles PB pour modifier VersionInfo

VersionInfo, kesako ?

Dans d'un exécutable ou d'une dll, il est possible d'ajouter une ressource de type VersionInfo qui permet d'indiquer le nom du programme, l'éditeur, le copyright et les numéros de version (il est également possible d'ajouter des informations supplémentaires, de type commentaire ou autre, c'est une simple association clé-valeur).

Ces informations, lorsqu'elles sont présentes sont par exemple visibles dans l'onglet "Version" des propriétés du fichier (avec XP, ou dans l'onglet "Details" avec Win7).

Le besoin : modifier les informations de version d'un executable

Les applications sur lesquelles je travaille utilisent chacune une base de donnée dédiée pour stocker la configuration et les données. Les applications sont packagées et envoyées à nos clients avec NSIS (Nullsoft Scriptable Install System). Pour permettre aux installeurs de fonctionner correctement (et d'éviter à nos clients de faire des bêtises ), les applications et les bases sont "versionnées", ce qui nous permet pour l'appli de distinguer les cas de régression, réinstallation ou mise à jour, et pour la base de ne pas ré-exécuter de script de mise à jour qui aurait déjà été utilisé.

Comme les applis sont suffisamment grosses pour ne pas pouvoir être envoyées par mail, mais que parfois un patch correctif peut se limiter à du sql, on a parfois besoin d'envoyer des scripts qui une fois compressés et packagés ne font que quelques dizaines à centaines de ko, ce qui est ok pour un mail. Mais on veut aussi modifier le n° de version de l'exe pour que les mises à jour ultérieures se gèrent correctement.

Problèmes liés à PB, et à Microsoft

Overlay PB
Tous les exécutables et dll Windows sont structurés de la même manière :

Code:

+-----------------------+
|       Entête DOS      |
+-----------------------+
|       Entête PE       |
+-----------------------+
|       Sections        |
| (code, data, imports) |
+-----------------------+
|       Ressources      |
|    (icônes, menus,    |
|      stringtables,    |
|      manifestes, ...) |
+-----------------------+

Dans les infos de l'entête, on a la taille de chaque section, et somme de toutes les tailles (qui s'alignent sur des multiples de 512) correspond à la taille de l'exécutable.

Mais pour PB c'est un peu particulier puisqu'il peut compiler du p-code (similaire au bytecode java); et lorsqu'on produit un exe, ce p-code est ajouté à la fin d'un mini-exécutable qui permet de charger la machine virtuelle PB, et de sauter ensuite dans le p-code. Ce bloc supplémentaire est appelé "overlay" et ça donne la structure suivante :

Code:

+-----------------------+
|       Entête DOS      |
+-----------------------+
|       Entête PE       |
+-----------------------+
|       Sections        |
| (code, data, imports) |
+-----------------------+
|       Ressources      |
|    (icônes, menus,    |
|      stringtables,    |
|      manifestes, ...) |
+-----------------------+
|        Code PB        |
|       (overlay)       |
+-----------------------+

Le problème c'est que Windows n'est pas au courant de l'existence de cet overlay, tout au plus il sait le copier avec le reste des données du fichier.

Difficultés dûes à Windows
1- Manipulation des ressources VersionInfo : dans l'API Windows, on peut interroger VersionInfo mais rien n'est prévu pour modifier cette ressource (qui est habituellement créée lors de la compilation du programme) de manière simple. Tout au plus on peut en fabriquer une nouvelle et demander via l'API à remplacer la ressource. De plus, vu que l'overlay PB est situé après les ressources et que windows n'en a cure, toute modification de ressource a pour effet de supprimer l'overlay et donc de casser votre programme. Si on veut le faire, il faut sauver l'overlay avant la modif, et le restaurer après.

2 - Structure de l'overlay : un autre problème est lié à l'agencement de données dans l'overlay : c'est en fait le contenu d'un pbd dans lequel tous les objets sont dans une sorte de liste chaînée utilisant l'offset depuis de début du fichier pour povoir passer d'un élément à l'autre. Le problème en modifiant les ressources c'est que si on en supprime ou si on en ajoute, on risque de décaler la position de l'overlay (aligné sur un multiple de 512). Il en résulte que notre pbd aura tous ses offsets faux et l'exe sera cassé. Grâce au travail d'Arnd Schmidt qui a documenté le format des pbd ici) j'arrive à en parcourir son contenu et à en corriger les offsets si nécessaire - c'est aussi comme cela que j'arrive à en exporter son contenu.

La solution

Pour répondre à cette problématique, j'ai codé la libverinfo permettant d'accéder en lecture à la ressource VersionInfo de n'importe quel exécutable et si on la modifie, dans le cas où c'est un exe PB, j'arrive à maintenir l'exe fonctionnel.

Ensuite j'ai codé un plugin pour NSIS qui utilise cette lib pour lire et / ou écrire les ressources VersionInfo lors du setup de l'appli.

Comme pour mes autres projets, je suis preneur de tout rapport de bug et suggestions, n'hésitez pas (et vive l'Open Source !)
Enjoy !

Dernière modification par seki (25-11-2011 10:55:29)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22