TN035 : Utilisation de plusieurs fichiers de ressources et fichiers d’en-tête avec Visual C++
Remarque
La note technique suivante n'a pas été mise à jour depuis son inclusion initiale dans la documentation en ligne. Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrectes. Pour obtenir les informations les plus récentes, il est recommandé de rechercher l'objet qui vous intéresse dans l'index de la documentation en ligne.
Cette remarque décrit comment l'éditeur de ressources Visual C++ prend en charge plusieurs fichiers de ressources et fichiers d'en-tête partagés dans un même projet ou parmi plusieurs projets, et comment tirer parti de cette prise en charge. Cette note répond à ces questions :
Quand vous souhaiterez peut-être fractionner un projet en plusieurs fichiers de ressources et/ou fichiers d’en-tête, et comment procéder
Comment partager un fichier d’en-tête
.H
commun entre deux.RC
fichiersComment diviser les ressources de projet en plusieurs
.RC
fichiersComment gérer (et les outils) les dépendances de génération entre
.RC
,.CPP
et.H
les fichiers
Sachez que si vous ajoutez un fichier de ressources supplémentaire à votre projet, ClassWizard ne reconnaît pas les ressources dans le fichier ajouté.
Cette note est structurée pour répondre aux questions ci-dessus comme suit :
Vue d’ensemble de la façon dont Visual C++ gère les fichiers de ressources et les fichiers d’en-tête fournit une vue d’ensemble de la façon dont la commande Resource Set Include dans Visual C++ vous permet d’utiliser plusieurs fichiers de ressources et fichiers d’en-tête dans le même projet.
L’analyse des fichiers créés
.RC
par AppWizard et.H
Fichiers examine les fichiers de ressources et d’en-têtes multiples utilisés par une application créée par AppWizard. Ces fichiers constituent un bon modèle pour les fichiers de ressources et les fichiers d'en-tête supplémentaires que vous pourriez souhaiter ajouter à votre projet.L’inclusion de fichiers d’en-tête supplémentaires décrit l’emplacement où vous souhaiterez peut-être inclure plusieurs fichiers d’en-tête et fournit des détails sur la procédure à suivre.
Le partage d’un fichier d’en-tête entre deux
.RC
fichiers montre comment partager un fichier d’en-tête entre plusieurs.RC
fichiers dans différents projets, ou peut-être dans le même projet.L’utilisation de plusieurs fichiers de ressources dans le même projet décrit l’emplacement où vous souhaiterez peut-être diviser votre projet en plusieurs
.RC
fichiers et fournit des détails sur la procédure à suivre.L’application des fichiers Visual C++ non modifiables décrit comment vous pouvez vous assurer que Visual C++ ne modifie pas et réforme involontairement une ressource personnalisée.
La gestion des symboles partagés par plusieurs fichiers modifiés
.RC
Visual C++décrit comment partager les mêmes symboles entre plusieurs.RC
fichiers et comment éviter d’affecter des valeurs numériques d’ID en double.La gestion des dépendances entre
.RC
,.CPP
et.H
les fichiers décrit comment Visual C++ évite les fichiers de recompilation.CPP
inutiles qui dépendent des fichiers de symboles de ressource.La façon dont Visual C++ gère Set Include fournit des informations techniques sur la façon dont Visual C++ effectue le suivi de plusieurs fichiers (imbriqués)
.RC
et de plusieurs fichiers d’en-tête inclus par un.RC
fichier.
Vue d’ensemble de la façon dont Visual C++ gère les fichiers de ressources et les fichiers d’en-tête
Visual C++ gère un fichier de ressources unique .RC
et un fichier d’en-tête correspondant .H
sous la forme d’une paire de fichiers étroitement couplée. Lorsque vous modifiez et enregistrez des ressources dans un .RC
fichier, vous modifiez et enregistrez indirectement des symboles dans le fichier correspondant .H
. Bien que vous puissiez ouvrir et modifier plusieurs .RC
fichiers à la fois (à l’aide de l’interface utilisateur MDI de Visual C++), pour tout fichier donné .RC
, vous modifiez indirectement un fichier d’en-tête correspondant.
Boîte de dialogue Éléments de ressource de l’affichage des ressources
Pour accéder à la ressource Inclut, ouvrez l’affichage des ressources, puis cliquez avec le bouton droit sur le .RC
fichier, puis sélectionnez Éléments de ressource inclus.
Fichier d'en-tête de symbole
Par défaut, Visual C++ nomme toujours le fichier RESOURCE.H
d’en-tête correspondant, quel que soit le nom du fichier de ressources (par exemple). MYAPP.RC
Le fichier d’en-tête de symbole : section de la boîte de dialogue Éléments de ressource dans Visual C++, vous permet de modifier le nom de ce fichier d’en-tête. Entrez un nouveau nom de fichier dans la zone d’édition de la section.
Remarque
les fichiers de ressources qui ne se trouvent pas dans le même répertoire que celui du .RC
fichier doivent prédéfini un chemin relatif avec une séquence d’échappement- '\' pour être lus correctement.
Directives de symboles en lecture seule
Bien que Visual C++ modifie uniquement un fichier d’en-tête pour un fichier donné .RC
, Visual C++ prend en charge les références aux symboles définis dans des fichiers d’en-tête en lecture seule supplémentaires. Les directives de symbole en lecture seule : section de la boîte de dialogue Éléments de ressource vous permettent de spécifier un nombre quelconque de fichiers d’en-tête en lecture seule supplémentaires en tant que directives de symbole en lecture seule. La restriction « en lecture seule » signifie que lorsque vous ajoutez une nouvelle ressource dans le .RC
fichier, vous pouvez utiliser un symbole défini dans le fichier d’en-tête en lecture seule. Toutefois, si vous supprimez la ressource, le symbole reste toujours défini dans le fichier d’en-tête en lecture seule. Vous ne pouvez pas modifier la valeur numérique affectée à un symbole en lecture seule.
Directives au moment de la compilation
Visual C++ prend également en charge l’imbrication de fichiers de ressources, où un .RC
fichier est inclus dans un autre à l’aide d’une #include
directive. Lorsque vous modifiez un fichier donné .RC
à l’aide de Visual C++, toutes les ressources des fichiers inclus ne sont pas visibles. Toutefois, lorsque vous compilez le .RC
fichier, les fichiers inclus sont également compilés. La section Directives de compilation au moment de la compilation : dans la boîte de dialogue Ressources Inclut , vous permet de spécifier un nombre quelconque de .RC
fichiers à inclure en tant que directives de compilation.
Notez ce qui se passe si vous lisez dans Visual C++ un .RC
fichier qui inclut un autre .RC
fichier qui n’est pas* spécifié comme directive au moment de la compilation. Cette situation peut survenir lorsque vous apportez à Visual C++ un .RC
fichier que vous aviez précédemment maintenu manuellement avec un éditeur de texte. Lorsque Visual C++ lit le fichier inclus .RC
, il fusionne les ressources incluses dans le fichier parent .RC
. Lorsque vous enregistrez le fichier parent .RC
, l’instruction #include
, en vigueur, sera remplacée par les ressources incluses. Si vous ne souhaitez pas que cette fusion se produise, vous devez supprimer l’instruction #include
du fichier parent .RC
avant de la lire dans Visual C++, puis en utilisant Visual C++, ajoutez la même #include
instruction qu’une directive compile-time.
Visual C++ enregistre dans un .RC
fichier les trois types de jeux ci-dessus Inclut des informations (fichier d’en-tête de symbole, directives de symbole en lecture seule et directives de compilation) dans #include
les directives et dans les TEXTINCLUDE
ressources. Les TEXTINCLUDE
ressources, un détail d’implémentation que vous n’avez pas normalement besoin de traiter, sont expliquées dans la façon dont Visual C++ gère le jeu inclut des informations.
Analyse des fichiers et .H
des fichiers créés par .RC
AppWizard
L'examen du code d'application produit par AppWizard permet d'en savoir plus sur la manière dont Visual C++ gère plusieurs fichiers de ressources et fichiers d'en-tête. Les extraits de code examinés ci-dessous proviennent d’une MYAPP
application produite par AppWizard à l’aide des options par défaut.
Une application créée par AppWizard utilise plusieurs fichiers de ressources et plusieurs fichiers d'en-tête, comme le résume le diagramme ci-dessous :
RESOURCE.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
AFXRES.RC
AFXPRINT.RC
Vous pouvez afficher ces multiples relations de fichiers à l'aide de la commande File/Set Includes de Visual C++.
MYAPP.RC
Fichier de ressources d’application que vous modifiez à l’aide de Visual C++.
RESOURCE.H
est le fichier d’en-tête spécifique à l’application. Elle est toujours nommée RESOURCE.H
par AppWizard, cohérente avec le nommage par défaut de Visual C++du fichier d’en-tête. Pour #include
ce fichier d’en-tête, il s’agit de la première instruction du fichier de ressources (MYAPP.RC
) :
//Microsoft Visual C++ generated resource script
//
#include "resource.h"
RES\MYAPP.RC2
Contient des ressources qui ne seront pas modifiées par Visual C++, mais qui seront incluses dans le fichier compilé .EXE
final. AppWizard ne crée pas ce genre de ressource par défaut, car Visual C++ peut modifier toutes les ressources standard, y compris la ressource de version (il s’agit d’une nouvelle fonctionnalité dans cette mise en production). Un fichier vide est généré par AppWizard au cas où vous souhaiteriez ajouter vos propres ressources mises en forme personnalisées à ce fichier.
Si vous utilisez des ressources mises en forme personnalisées, vous pouvez les ajouter et les modifier à RES\MYAPP.RC2
l’aide de l’éditeur de texte Visual C++.
AFXRES.RC
et AFXPRINT.RC
contiennent des ressources standard requises par certaines fonctionnalités de l’infrastructure. Comme RES\MYAPP.RC2
, ces deux fichiers de ressources fournis par l’infrastructure sont inclus à la fin de , et ils sont spécifiés dans la boîte de MYAPP.RC
dialogue Compiler-Time Directives of the Set Include. Par conséquent, vous n’affichez pas ou modifiez directement ces ressources d’infrastructure pendant que vous modifiez MYAPP.RC
dans Visual C++, mais elles sont compilées dans le fichier binaire .RES
de l’application et le fichier final .EXE
. Pour plus d’informations sur les ressources de framework standard, notamment sur les procédures de modification de ces ressources, consultez la note technique 23.
AFXRES.H
définit des symboles standard, tels que ID_FILE_NEW
, utilisés par l’infrastructure et spécifiquement utilisés dans AFXRES.RC
. AFXRES.H
utilise #include
également pour inclure WINRES.H
, qui contient un sous-ensemble de WINDOWS.H
ce qui est nécessaire par les fichiers générés .RC
par Visual C++ et AFXRES.RC
. Les symboles définis dans AFXRES.H
sont disponibles lorsque vous modifiez le fichier de ressources de l’application (MYAPP.RC
). Par exemple, ID_FILE_NEW
il est utilisé pour l’élément File
New
de menu dans la MYAPP.RC
ressource de menu du fichier. Vous ne pouvez pas modifier ou supprimer ces symboles définis par l’infrastructure.
Inclusion de fichiers d’en-tête supplémentaires
L’application créée par AppWizard inclut uniquement deux fichiers d’en-tête : RESOURCE.H
et AFXRES.H
. Seul RESOURCE.H
l’application est spécifique à l’application. Vous devrez peut-être inclure des fichiers d'en-tête en lecture seule supplémentaires dans les cas suivants :
Le fichier d'en-tête est fourni par une source externe ou vous souhaitez partager le fichier d'en-tête entre plusieurs projets ou plusieurs parties du même projet.
Le fichier d’en-tête a une mise en forme et des commentaires que vous ne souhaitez pas que Visual C++ modifie ou filtre lorsqu’il enregistre le fichier. Par exemple, vous souhaitez peut-être conserver des #define qui utilisent une arithmétique symbolique telle que :
#define RED 0
#define BLUE 1
#define GREEN 2
#define ID_COLOR_BUTTON 1001
#define ID_RED_BUTTON (ID_COLOR_BUTTON + RED)
#define ID_BLUE_BUTTON (ID_COLOR_BUTTON + BLUE)
#define ID_GREEN_BUTTON (ID_COLOR_BUTTON + GREEN)
Vous pouvez inclure des fichiers d’en-tête en lecture seule supplémentaires à l’aide de la commande Resource Include pour spécifier l’instruction #include
en tant que deuxième directive de symbole en lecture seule, comme dans :
#include "afxres.h"
#include "second.h"
Le nouveau diagramme des relations de fichiers se présente désormais comme suit :
AFXRES.H
RESOURCE.H SECOND.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
AFXRES.RC
AFXPRINT.RC
Partage d’un fichier d’en-tête entre deux .RC
fichiers
Vous pouvez partager un fichier d’en-tête entre deux .RC
fichiers qui se trouvent dans des projets différents, ou éventuellement le même projet. Pour ce faire, appliquez la technique de directives en lecture seule décrite ci-dessus aux deux .RC
fichiers. Dans le cas où les deux .RC
fichiers concernent des applications différentes (projets différents), le résultat est illustré dans le diagramme suivant :
RESOURCE.H AFXRES.H RESOURCE.H
(for MYAPP1) SECOND.H (for MYAPP2)
\ / \ /
\ / \ /
MYAPP1.RC MYAPP2.RC
/ \ / \
/ \ / \
RES\MYAPP1.RC2 AFXRES.RC RES\MYAPP2.RC2
AFXPRINT.RC
Le cas où le deuxième fichier d’en-tête est partagé par deux .RC
fichiers dans la même application (projet) est décrit ci-dessous.
Utilisation de plusieurs fichiers de ressources dans le même projet
Visual C++ et le compilateur de ressources prennent en charge plusieurs .RC
fichiers dans le même projet via #include
des directives qui incluent un fichier dans un .RC
autre. L'imbrication multiple est autorisée. Il existe différentes raisons de fractionner les ressources de votre projet en plusieurs .RC
fichiers :
Il est plus facile de gérer un grand nombre de ressources parmi plusieurs membres de l’équipe de projet si vous fractionnez les ressources en plusieurs
.RC
fichiers. Si vous utilisez un package de gestion du contrôle de code source pour case activée extraire des fichiers et case activée dans les modifications, le fractionnement des ressources en plusieurs.RC
fichiers vous permet de contrôler plus finement la gestion des modifications apportées aux ressources.Si vous souhaitez utiliser des directives de préprocesseur, telles que
#ifdef
,#endif
et , pour#define
des parties de vos ressources, vous devez les isoler dans des ressources en lecture seule qui seront compilées par le compilateur de ressources.Les fichiers de composant
.RC
chargent et enregistrent plus rapidement dans Visual C++ qu’un seul fichier composite.RC
.Si vous souhaitez conserver une ressource avec un éditeur de texte dans un formulaire lisible par l’homme, vous devez le conserver dans un
.RC
fichier distinct de celui qui modifie Visual C++.Si vous devez conserver une ressource définie par l’utilisateur dans un formulaire binaire ou texte interprétable par un autre éditeur de données spécialisé, vous devez le conserver dans un fichier distinct
.RC
afin que Visual C++ ne modifie pas le format en données hexadécimales. Les.WAV
ressources de fichier (son) dans l’exemple MFC Advanced Concepts SPEAKN sont un bon exemple.
Vous pouvez inclure SECOND.RC
dans les directives de compilation dans la boîte de dialogue Définir inclut :
#include "res\myapp.rc2" // non-Visual C++ edited resources
#include "second.rc" // THE SECOND .RC FILE
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
Le résultat est illustré dans le diagramme ci-dessous :
RESOURCE.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
SECOND.RC
AFXRES.RC
AFXPRINT.RC
À l’aide des directives de compilation, vous pouvez organiser vos ressources Visual C++modifiables et non modifiables dans plusieurs .RC
fichiers, où le principal MYAPP.RC
ne fait rien, mais #include
les autres .RC
fichiers. Si vous utilisez un fichier projet .MAK
Visual Studio C++, vous devez inclure le fichier principal .RC
dans le projet afin que toutes les ressources incluses soient compilées avec votre application.
Application des fichiers Visual C++ non modifiables
Le fichier créé par RES\MYAPP.RC2
AppWizard est un exemple de fichier qui contient des ressources que vous ne souhaitez pas lire accidentellement dans Visual C++, puis écrire en arrière avec une perte d’informations de mise en forme. Pour vous protéger contre ce problème, placez les lignes suivantes au début du RES\MYAPP.RC2
fichier :
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Visual C++
#endif //APSTUDIO_INVOKED
Lorsque Visual C++ compile le fichier, il définit à la .RC
fois APSTUDIO_INVOKED
et RC_INVOKED
. Si la structure de fichiers créée par AppWizard est endommagée et visual C++ lit la ligne #error ci-dessus, elle signale une erreur irrécupérable et abandonne la lecture du .RC
fichier.
Gestion des symboles partagés par plusieurs fichiers visual C++modifiés .RC
Deux problèmes se produisent lorsque vous fractionnez vos ressources en plusieurs .RC
fichiers que vous souhaitez modifier séparément dans Visual C++ :
Vous pouvez partager les mêmes symboles sur plusieurs
.RC
fichiers.Vous devez faire en sorte que Visual C++ évite d'assigner les mêmes valeurs numériques d'ID à des ressources distinctes (symboles).
Le diagramme suivant illustre une organisation de fichiers et .H
d’organisations .RC
qui traite du premier problème :
MYAPP.RC
/ \
/ \
MYSTRS.H / MYSHARED.H \ MYMENUS.H
\ / / \ \ \
\ / / \ \ \
MYSTRS.RC MYMENUS.RC
Dans cet exemple, les ressources de chaîne sont conservées dans un fichier de ressources, MYSTRS.RC
et les menus sont conservés dans un autre. MYMENUS.RC
Certains symboles, par exemple pour les commandes, peuvent devoir être partagés entre les deux fichiers. Par exemple, il ID_TOOLS_SPELL
peut s’agir de l’ID de commande de menu de l’élément Spell dans un menu Outils ; et il peut également s’agir de l’ID de chaîne de l’invite de commandes affichée par l’infrastructure dans la barre d’état de la fenêtre principale de l’application.
Le ID_TOOLS_SPELL
symbole est conservé dans le fichier d’en-tête partagé. MYSHARED.H
Vous gérez manuellement ce fichier d’en-tête partagé avec un éditeur de texte ; Visual C++ ne le modifie pas directement. Dans les deux fichiers MYSTRS.RC
de ressources et MYMENUS.RC
, vous spécifiez #include "MYSHARED.H"
dans les directives en lecture seule pour MYAPP.RC
, à l’aide de la commande Resource Include , comme décrit précédemment.
Il est plus pratique d’anticiper un symbole que vous partagerez avant de tenter de l’utiliser pour identifier n’importe quelle ressource. Ajoutez le symbole au fichier d’en-tête partagé et, si vous n’avez pas déjà inclus le fichier d’en-tête partagé dans les directives en lecture seule pour le .RC
fichier, faites-le avant d’utiliser le symbole. Si vous n’avez pas prévu de partager le symbole de cette façon, vous devrez déplacer manuellement (à l’aide d’un éditeur de texte) l’instruction #define pour le symbole, par exemple, MYMENUS.H
avant MYSHARED.H
de l’utiliser.MYSTRS.RC
Lorsque vous gérez des symboles dans plusieurs .RC
fichiers, vous devez également aider Visual C++ à éviter d’affecter les mêmes valeurs numériques d’ID aux ressources distinctes (symboles). Pour un fichier donné .RC
, Visual C++ affecte de façon incrémentielle des ID dans chacun des quatre domaines d’ID. Entre les sessions d’édition, Visual C++ effectue le suivi du dernier ID qu’il a affecté dans chacun des domaines du fichier d’en-tête de symbole pour le .RC
fichier. Voici les APS_NEXT
valeurs d’un fichier (nouveau) .RC
vide :
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
_APS_NEXT_RESOURCE_VALUE
est la valeur de symbole suivante qui sera utilisée pour une ressource de dialogue, une ressource de menu, et ainsi de suite. La plage valide des valeurs de symboles de ressources est comprise entre 1 et 0x6FFF.
_APS_NEXT_COMMAND_VALUE
est la valeur de symbole suivante qui sera utilisée pour une identification de commande. La plage valide des valeurs de symboles de commandes est comprise entre 0x8000 et 0xDFFF.
_APS_NEXT_CONTROL_VALUE
est la valeur de symbole suivante qui sera utilisée pour un contrôle de boîte de dialogue. La plage valide des valeurs de symboles de contrôles de boîtes de dialogue est comprise entre 8 et 0xDFFF.
_APS_NEXT_SYMED_VALUE
est la valeur de symbole suivante qui sera émise lorsque vous affectez manuellement une valeur de symbole à l’aide de la commande New dans l’Explorateur de symboles.
Visual C++ commence par des valeurs légèrement plus élevées que la valeur juridique la plus faible lors de la création d’un .RC
fichier. AppWizard initialise également ces valeurs à quelque chose de plus approprié pour les applications MFC. Pour plus d’informations sur les plages de valeurs d’ID, consultez La note technique 20.
À présent, chaque fois que vous créez un fichier de ressources, même dans le même projet, Visual C++ définit les mêmes _APS_NEXT_
valeurs. Cela signifie que si vous ajoutez, par exemple, plusieurs dialogues dans deux fichiers différents .RC
, il est très probable que la même valeur #define soit affectée à différents dialogues. Par exemple, IDD_MY_DLG1
dans le premier .RC
fichier peut être affecté le même nombre, 101, que IDD_MY_DLG2
dans un deuxième .RC
fichier.
Pour éviter ce problème, vous devez réserver une plage numérique distincte pour chacun des quatre domaines d’ID dans les fichiers respectifs .RC
. Définissez les plages en mettant à jour manuellement les _APS_NEXT
valeurs dans chacun des fichiers avant de .RC
commencer à ajouter des ressources. Par exemple, si le premier .RC
fichier utilise les valeurs par défaut _APS_NEXT
, vous pouvez affecter les valeurs suivantes _APS_NEXT
au deuxième .RC
fichier :
#define _APS_NEXT_RESOURCE_VALUE 2000
#define _APS_NEXT_COMMAND_VALUE 42000
#define _APS_NEXT_CONTROL_VALUE 2000
#define _APS_NEXT_SYMED_VALUE 2000
Bien sûr, il est toujours possible que Visual C++ affecte autant d’ID dans le premier .RC
fichier que les valeurs numériques commencent à chevaucher celles réservées pour le deuxième .RC
fichier. Vous devez réserver suffisamment de larges plages pour que cette collision ne se produise pas.
Gestion des dépendances entre .RC
les fichiers et .H
les .CPP
fichiers
Lorsque Visual C++ enregistre un .RC
fichier, il enregistre également les modifications de symboles dans le fichier correspondant RESOURCE.H
. Tous vos .CPP
fichiers qui font référence aux ressources du .RC
fichier doivent être utilisés #include
pour inclure le RESOURCE.H
fichier, généralement à partir du fichier d’en-tête principal de votre projet. Cette inclusion entraîne un effet secondaire indésirable en raison de la gestion interne de projet de l’environnement de développement, qui analyse les fichiers sources pour les dépendances d’en-tête. Chaque fois que vous ajoutez un nouveau symbole dans Visual C++, tous les .CPP
fichiers qui ont #include "RESOURCE.H"
des directives doivent être recompilés.
Visual C++, contourne la dépendance en RESOURCE.H
incluant le commentaire suivant comme première ligne du RESOURCE.H
fichier :
//{{NO_DEPENDENCIES}}
L’environnement de développement interprète ce commentaire en ignorant les modifications apportées afin RESOURCE.H
que les fichiers dépendants .CPP
n’ont pas besoin d’être recompilés.
Visual C++ ajoute toujours la ligne de //{{NO_DEPENDENCIES}}
commentaire à un .RC
fichier lorsqu’il enregistre le fichier. Dans certains cas, le contournement de la dépendance RESOURCE.H
de build peut entraîner des erreurs d’exécution non détectées au moment du lien. Par exemple, si vous utilisez l’Explorateur de symboles pour modifier la valeur numérique affectée à un symbole pour une ressource, la ressource n’est pas correctement trouvée et chargée au moment de l’exécution de l’application si le .CPP
fichier faisant référence à la ressource n’est pas recompilé. Dans ce cas, vous devez recompiler explicitement tous .CPP
les fichiers que vous savez sont affectés par les modifications de symboles dans RESOURCE.H
ou sélectionner Reconstruire tout. Si vous avez besoin de modifier fréquemment des valeurs de symboles pour un certain groupe de ressources, vous trouverez probablement plus pratique et plus sûr de décomposer ces symboles dans un fichier d’en-tête en lecture seule distinct, comme décrit dans la section ci-dessus, y compris des fichiers d’en-tête supplémentaires.
Comment Visual C++ gère Set Includes information
Comme décrit ci-dessus, la commande Set Includes du menu Fichier vous permet de spécifier trois types d'informations :
Fichier d'en-tête de symbole
Directives de symboles en lecture seule
Directives au moment de la compilation
Le tableau suivant décrit comment Visual C++ gère ces informations dans un .RC
fichier. Vous n’avez pas besoin de ces informations pour utiliser Visual C++, mais cela peut améliorer votre compréhension afin que vous puissiez utiliser plus en toute confiance la fonctionnalité Set Includes.
Chacun des trois types ci-dessus d’informations Set Include est stocké dans le .RC
fichier sous deux formes : (1) comme #include
ou d’autres directives interprétables par le compilateur de ressources, et (2) comme ressources spéciales TEXTINCLUDE
interprétables uniquement par Visual C++.
L’objectif de la TEXTINCLUDE
ressource est de stocker en toute sécurité les informations Set Include dans un formulaire facilement présentable dans la boîte de dialogue Set Include de Visual C++. TEXTINCLUDE
est un type de ressource défini par Visual C++. Visual C++ reconnaît trois ressources spécifiques TEXTINCLUDE
qui ont les numéros d’identification des ressources 1, 2 et 3 :
TEXTINCLUDE ID de ressource |
Type d'informations Set Includes |
---|---|
1 | Fichier d'en-tête de symbole |
2 | Directives de symboles en lecture seule |
3 | Directives au moment de la compilation |
Chacun des trois types d’informations Set Include est illustré par défaut MYAPP.RC
et RESOURCE.H
les fichiers créés par AppWizard, comme décrit ci-dessous. Les jetons supplémentaires \0
et ""
END
les BEGIN
blocs sont requis par la syntaxe RC pour spécifier respectivement les chaînes arrêtées zéro et le caractère de guillemet double.
Fichier d'en-tête de symbole
La forme des informations de fichier d’en-tête de symbole interprétées par le compilateur de ressources est simplement une #include
instruction :
#include "resource.h"
La ressource correspondante TEXTINCLUDE
est la suivante :
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
Directives de symboles en lecture seule
Les directives de symbole en lecture seule sont incluses en haut de la forme suivante, interprétables par le compilateur de MYAPP.RC
ressources :
#include "afxres.h"
La ressource correspondante TEXTINCLUDE
est la suivante :
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
Directives au moment de la compilation
Les directives au moment de la compilation sont incluses à la fin de la forme suivante interprétable par le compilateur de MYAPP.RC
ressources :
#ifndef APSTUDIO_INVOKED
///////////////////////
//
// From TEXTINCLUDE 3
//
#include "res\myapp.rc2" // non-Visual C++ edited resources
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
#endif // not APSTUDIO_INVOKED
La #ifndef APSTUDIO_INVOKED
directive indique à Visual C++ d’ignorer les directives au moment de la compilation.
La ressource correspondante TEXTINCLUDE
est la suivante :
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""res\myapp.rc2"" // non-Visual C++ edited resources\r\n"
"\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#include ""afxprint.rc"" // printing/print preview resources\r\n"
"\0"
END