Utiliser les ressources Windows
La directive de ressources $R
Sous Windows et Linux (ou toute plateforme utilisant les binaires ELF), vous pouvez inclure des ressources dans votre exécutable ou votre bibliothèque à l'aide de la directive {$R filename}. Ces ressources sont ensuite accessibles via les appels API Windows standard : ces appels ont également été rendus disponibles sur les autres plates-formes.
Lorsque le compilateur rencontre une directive de ressource, il crée simplement une entrée dans le fichier d'unité .ppu ; il ne relie pas la ressource. Ce n'est que lorsqu'il crée une bibliothèque ou un exécutable qu'il recherche tous les fichiers de ressources pour lesquels il a rencontré une directive et essaie de les lier.
L'extension par défaut des fichiers de ressources est .res. Lorsque le nom de fichier a comme premier caractère un astérisque (*), le compilateur remplacera l'astérisque par le nom de l'unité, de la bibliothèque ou du programme actuel.
Remarque : Cela signifie que l'astérisque ne peut être utilisé qu'après une clause d'unité, de bibliothèque ou de programme.
Créer des ressources
Le compilateur Free Pascal lui-même ne crée aucun fichier de ressources ; il les compile simplement dans l'exécutable. Pour créer des fichiers de ressources, vous pouvez utiliser certains outils GUI comme l'atelier de ressources Borland ; mais il est également possible d'utiliser un compilateur de ressources Windows comme Windres de GNU. Windres est livré avec les binutils de GNU, mais la distribution Free Pascal contient également une version que vous pouvez utiliser.
L'utilisation de Windres est simple ; il lit un fichier d'entrée décrivant les ressources pour créer et génère un fichier de ressources.
Un appel typique de windres serait :
windres -i mystrings.rc -o mystrings.res |
cela lira le fichier mystrings.rc et générera un fichier de ressources mystrings.res. Un aperçu complet des outils Windres sort du cadre de cette page, mais voici certaines choses pour lesquelles vous pouvez l'utiliser :
Utilisation | Description |
---|---|
STRINGTABLE | Contenant des listes de chaînes de caractères. |
Bitmaps | Étant lus à partir d'un fichier externe. |
Icônes | Étant également lus à partir d'un fichier externe. |
Version information | Pouvant être visualisé avec l'explorateur Windows. |
Menus | Peut être conçu comme des ressources et utilisé dans vos applications GUI. |
Données arbitraires | Peut être inclus en tant que ressources et lu avec les appels de l'API Windows. |
Certains d'entre eux seront décrits ci-dessous.
Utiliser des tables de chaînes de caractères
Les tables de chaînes de caractères peuvent être utilisées pour entreposer et récupérer de grandes collections de chaînes de caractères dans votre application.
Une table de chaînes de caractères se présente comme suit :
- STRINGTABLE {
- 1, "Bonjour !"
- 2, "Encore bonjour !"
- 3, "Dernier bonjour !"
- }
Vous pouvez compiler ceci (nous supposons que le fichier s'appelle tests.rc) comme suit :
windres -i tests.rc -o tests.res |
Et voici comment récupérer les chaînes de caractères de votre programme :
L'appel à FindResource recherche la table de chaînes de caractères dans les ressources compilées. La fonction LoadString lit ensuite la chaîne de caractères d'index i hors de la table et la place dans un tampon, pouvant ensuite être utilisé. Les deux appels sont dans l'unité Windows.
Insertion des informations de version
L'API win32 permet l'entreposage des informations de version dans vos binaires. Ces informations peuvent être rendues visibles avec l'Explorateur Windows, en cliquant avec le bouton droit sur l'exécutable ou la bibliothèque et en sélectionnant le menu «Properties». Dans l'onglet «Version», les informations sur la version seront affichées. Voici comment insérer les informations de version dans votre binaire :
- 1 VERSIONINFO
- FILEVERSION 4, 0, 3, 17
- PRODUCTVERSION 3, 0, 0, 0
- FILEFLAGSMASK 0
- FILEOS 0x40000
- FILETYPE 1
- {
- BLOCK "StringFileInfo"
- {
- BLOCK "040904E4"
- {
- VALUE "CompanyName", "Free Pascal"
- VALUE "FileDescription", "Extracteur d'informations sur la version Free Pascal"
- VALUE "FileVersion", "1.0"
- VALUE "InternalName", "Showver"
- VALUE "LegalCopyright", "GNU Public License"
- VALUE "OriginalFilename", "showver.pp"
- VALUE "ProductName", "Free Pascal"
- VALUE "ProductVersion", "1.0"
- }
- }
- }
Comme vous pouvez le constater, vous pouvez insérer différents types d'informations dans le bloc d'informations sur la version. Le mot-clef VERSIONINFO marque le début du bloc de ressources d'informations de version. Les mots-clefs FILEVERSION, PRODUCTVERSION donnent la version réelle du fichier, tandis que le bloc StringFileInfo donne d'autres informations affichées dans l'explorateur.
La bibliothèque de Free Component Library est livrée avec une unité (fileinfo) permettant d'extraire et d'afficher les informations de version de manière simple et directe ; le programme de démonstration l'accompagnant (showver) affiche les informations de version d'un exécutable ou d'une DLL arbitraire.
Insérer une icône d'application
Lorsque Windows affiche un exécutable dans l'Explorateur, il recherche une icône dans l'exécutable pour afficher devant le nom du fichier, l'icône de l'application.
L'insertion d'une icône d'application est très simple et peut se faire comme suit :
- AppIcon ICON "filename.ico"
Cela lira le fichier filename.ico et l'insérera dans le fichier de ressources.
Utilisation d'un préprocesseur Pascal
Parfois, vous souhaitez utiliser des noms symboliques dans votre fichier de ressources et utiliser les mêmes noms dans votre programme pour accéder aux ressources. Pour ce faire, il existe un préprocesseur pour Windres comprenant la syntaxe Pascal : fprcp. Ce préprocesseur est livré avec la distribution Free Pascal.
L'idée est que le préprocesseur lit une unité pascal dans laquelle sont définies des constantes symboliques et remplace les noms symboliques dans le fichier de ressources par les valeurs des constantes de l'unité.
A titre d'exemple : considérons l'unité suivante :
Et le fichier ressource suivant :
- #include "myunit.pp"
-
- STRINGTABLE {
- First, "Bonjour !"
- Second, "Encore bonjour !"
- Third, "Dernier bonjour !" }
Si vous appelez windres avec l'option préprocesseur :
windres --preprocessor fprcp -i myunit.rc -o myunit.res |
Ensuite, le préprocesseur remplacera les noms symboliques «First», «Second» et «Third» par leurs valeurs réelles.
Dans votre programme, vous pouvez alors faire référence aux chaînes par leurs noms symboliques (les constantes) au lieu d'utiliser un index numérique.