TN035: Verwenden mehrerer Ressourcendateien und Headerdateien mit Visual C++
Hinweis
Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert. Daher können einige Verfahren und Themen veraltet oder falsch sein. Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.
In diesem Hinweis wird beschrieben, wie der Visual C++-Ressourcen-Editor mehrere entweder in einem einzelnen Projekt oder in mehreren Projekten gemeinsam genutzte Ressourcendateien und Headerdateien unterstützt und wie Sie von dieser Unterstützung profitieren. In dem Hinweis werden folgende Fragen beantwortet:
Wann möchten Sie ein Projekt möglicherweise in mehrere Ressourcendateien und/oder Headerdateien aufteilen und wie Sie es tun?
Wie können Sie eine gemeinsame Headerdatei
.H
zwischen zwei.RC
Dateien freigebenWie unterteilen Sie Projektressourcen in mehrere
.RC
DateienWie verwalten Sie (und die Tools) Buildabhängigkeiten zwischen
.RC
,.CPP
und.H
Dateien
Wenn Sie Ihrem Projekt eine zusätzliche Ressourcendatei hinzufügen, erkennt ClassWizard die Ressourcen in der hinzugefügten Datei nicht.
Die oben genannten Fragen werden in diesem Hinweis anhand der folgenden Gliederung beantwortet:
Übersicht darüber, wie Visual C++ Ressourcendateien und Headerdateien verwaltet, bietet eine Übersicht darüber, wie der Befehl "Resource Set Includes" in Visual C++ ihnen die Verwendung mehrerer Ressourcendateien und Headerdateien im selben Projekt ermöglicht.
Die Analyse der von AppWizard erstellten
.RC
Dateien und.H
Dateien untersucht die mehreren Ressourcen- und Headerdateien, die von einer appWizard-erstellten Anwendung verwendet werden. Diese Dateien sind ein gutes Beispiel für zusätzliche Ressourcen- und Headerdateien, die Sie dem Projekt hinzufügen können.Das Einschließen zusätzlicher Headerdateien beschreibt, wo Sie möglicherweise mehrere Headerdateien einschließen möchten, und enthält Details dazu.
Das Freigeben einer Headerdatei zwischen zwei
.RC
Dateien zeigt, wie Sie eine Headerdatei zwischen mehreren.RC
Dateien in verschiedenen Projekten oder vielleicht im selben Projekt freigeben können.Die Verwendung mehrerer Ressourcendateien im selben Projekt beschreibt, wo Sie Ihr Projekt in mehrere
.RC
Dateien aufteilen möchten, und enthält Details dazu.Die Erzwingung nicht bearbeitbarer Visual C++-Dateien beschreibt, wie Sie sicherstellen können, dass Visual C++ keine benutzerdefinierte Ressource nicht bearbeitet und unbeabsichtigt neu formatiert.
Das Verwalten von Symbolen, die von mehreren visual C++-bearbeiteten
.RC
Dateien gemeinsam verwendet werden, beschreibt, wie sie dieselben Symbole für mehrere.RC
Dateien freigeben und wie Sie vermeiden, doppelten ID-Numerischen Werten zuzuweisen.Das Verwalten von Abhängigkeiten zwischen
.RC
,.CPP
und.H
Dateien beschreibt, wie Visual C++ unnötige Neukompilierung.CPP
von Dateien verhindert, die von Ressourcensymboldateien abhängig sind.Wie Visual C++ Set Includes verwaltet, enthält technische Details dazu, wie Visual C++ mehrere (geschachtelte)
.RC
Dateien und mehrere Headerdateien nachverfolgt, die in einer.RC
Datei enthalten sind.
Übersicht über die Verwaltung von Ressourcendateien und Headerdateien in Visual C++
Visual C++ verwaltet eine einzelne .RC
Ressourcendatei und eine entsprechende .H
Headerdatei als eng gekoppeltes Paar von Dateien. Wenn Sie Ressourcen in einer .RC
Datei bearbeiten und speichern, bearbeiten und speichern Sie Symbole indirekt in der entsprechenden .H
Datei. Obwohl Sie mehrere .RC
Dateien gleichzeitig öffnen und bearbeiten können (mithilfe der MDI-Benutzeroberfläche von Visual C++), bearbeiten Sie für jede datei .RC
, die Sie indirekt bearbeiten, genau eine entsprechende Headerdatei.
Das Dialogfeld "Ressource" der Ressourcenansicht enthält
Um auf die Ressource einschließt, öffnen Sie die Ressourcenansicht, und klicken Sie dann mit der rechten Maustaste auf die .RC
Datei, und wählen Sie "Ressource enthält" aus.
Symbolheaderdatei
Standardmäßig benennt Visual C++ immer die entsprechende Headerdatei RESOURCE.H
, unabhängig vom Namen der Ressourcendatei (z. B MYAPP.RC
. ). Mit der Kopfzeilendatei "Symbol" im Dialogfeld "Ressource enthält" in Visual C++ können Sie den Namen dieser Headerdatei ändern. Geben Sie einen neuen Dateinamen in das Bearbeitungsfeld des Abschnitts ein.
Hinweis
Ressourcendateien, die sich nicht im selben Verzeichnis befinden wie die .RC
Datei, müssen einen relativen Pfad mit escaped-'\' vorangestellt werden, damit sie ordnungsgemäß gelesen werden.
Direktiven für schreibgeschützte Symbole
Obwohl Visual C++ nur eine Headerdatei für eine bestimmte .RC
Datei bearbeitet, unterstützt Visual C++ Verweise auf Symbole, die in zusätzlichen schreibgeschützten Headerdateien definiert sind. Der Abschnitt "Schreibgeschützte Symboldirektiven: " im Dialogfeld "Ressource enthält " ermöglicht ihnen, eine beliebige Anzahl zusätzlicher schreibgeschützter Headerdateien als Schreibgeschützte Symboldirektiven anzugeben. Die Einschränkung "schreibgeschützt" bedeutet, dass Sie beim Hinzufügen einer neuen Ressource in der .RC
Datei ein Symbol verwenden können, das in der schreibgeschützten Headerdatei definiert ist. Wenn Sie die Ressource jedoch löschen, wird das In der schreibgeschützten Headerdatei definierte Symbol weiterhin erneut Standard. Sie können den numerischen Wert, der einem schreibgeschützten Symbol zugewiesen ist, nicht ändern.
Kompilierzeitanweisungen
Visual C++ unterstützt auch die Schachtelung von Ressourcendateien, wobei eine .RC
Datei mithilfe einer Direktive in eine #include
andere eingeschlossen wird. Wenn Sie eine bestimmte .RC
Datei mit Visual C++ bearbeiten, sind alle Ressourcen in den enthaltenen Dateien nicht sichtbar. Beim Kompilieren der .RC
Datei werden die enthaltenen Dateien jedoch ebenfalls kompiliert. Der Abschnitt "Kompilierungszeitdirektiven: " im Dialogfeld "Ressourcen enthält " ermöglicht ihnen, eine beliebige Anzahl von .RC
Dateien anzugeben, die als Kompilierungszeitdirektiven eingeschlossen werden sollen.
Beachten Sie, was passiert, wenn Sie in Visual C++ eine .RC
Datei lesen, die eine andere .RC
Datei enthält, die nicht* als Kompilierungszeitdirektive angegeben ist. Diese Situation kann auftreten, wenn Sie visual C++ in eine .RC
Datei übertragen, die Sie zuvor manuell mit einem Text-Editor Standard. Wenn Visual C++ die enthaltene .RC
Datei liest, werden die enthaltenen Ressourcen in der übergeordneten .RC
Datei zusammengeführt. Wenn Sie die übergeordnete .RC
Datei speichern, wird die #include
Anweisung in Kraft durch die enthaltenen Ressourcen ersetzt. Wenn diese Zusammenführung nicht ausgeführt werden soll, sollten Sie die #include
Anweisung vor dem Lesen in Visual C++ aus der übergeordneten .RC
Datei entfernen. Fügen Sie dann mit Visual C++ die gleiche #include
Anweisung wie eine Kompilierungszeitdirektive hinzu.
Visual C++ speichert in einer .RC
Datei die drei oben genannten Arten von Set enthält Informationen (Symbolheaderdatei, Schreibgeschützte Symboldirektiven und Kompilierungszeitdirektiven) in #include
Direktiven und in TEXTINCLUDE
Ressourcen. Die TEXTINCLUDE
Ressourcen, ein Implementierungsdetail, mit dem Sie normalerweise nicht umgehen müssen, werden in visual C++ erläutert, wie Visual C++ den Satz verwaltet, enthält Informationen.
Analyse von von AppWizard erstellten .RC
und .H
Dateien
Eine Überprüfung des von AppWizard erzeugten Anwendungscodes liefert Informationen darüber, wie in Visual C++ mehrere Ressourcendateien und Headerdateien verwaltet werden. Die unten untersuchten Codeauszüge stammen aus einer MYAPP
Anwendung, die von AppWizard unter Verwendung der Standardoptionen erstellt wurde.
Eine von AppWizard erstellte Anwendung verwendet mehrere Ressourcendateien und mehrere Headerdateien, wie im folgenden Diagramm dargestellt:
RESOURCE.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
AFXRES.RC
AFXPRINT.RC
Sie können diese Beziehungen zwischen mehreren Dateien mit dem Befehl "Visual C++-Datei/Gruppe enthält" anzeigen.
MYAPP.RC
Die Anwendungsressourcendatei, die Sie mit Visual C++ bearbeiten.
RESOURCE.H
ist die anwendungsspezifische Headerdatei. Es wird immer von AppWizard benannt RESOURCE.H
, konsistent mit der Standardbenennung der Headerdatei von Visual C++. Die #include
für diese Headerdatei ist die erste Anweisung in der Ressourcendatei (MYAPP.RC
):
//Microsoft Visual C++ generated resource script
//
#include "resource.h"
RES\MYAPP.RC2
Enthält Ressourcen, die nicht von Visual C++ bearbeitet werden, aber in die endgültige kompilierte .EXE
Datei einbezogen werden. AppWizard erstellt solche Ressourcen nicht standardmäßig, da Visual C++ alle Standardressourcen bearbeiten kann, einschließlich der Versionsressource (eine neue Funktion in diesem Release). Von AppWizard wird eine leere Datei generiert, falls Sie dieser Datei eigene benutzerdefinierte formatierte Ressourcen hinzufügen möchten.
Wenn Sie benutzerdefinierte formatierte Ressourcen verwenden, können Sie sie RES\MYAPP.RC2
mithilfe des Visual C++-Text-Editors hinzufügen und bearbeiten.
AFXRES.RC
und AFXPRINT.RC
enthalten Standardressourcen, die von bestimmten Features des Frameworks benötigt werden. Wie RES\MYAPP.RC2
diese beiden vom Framework bereitgestellten Ressourcendateien sind am Ende enthalten MYAPP.RC
, und sie werden in den Kompilierungszeitdirektiven des Dialogfelds "Set Umfasst" angegeben. Daher können Sie diese Frameworkressourcen nicht direkt anzeigen oder bearbeiten, während Sie in Visual C++ bearbeiten MYAPP.RC
, aber sie werden in die Binärdatei .RES
und die endgültige .EXE
Datei der Anwendung kompiliert. Weitere Informationen zu den Standardframeworkressourcen, einschließlich Verfahren zum Ändern dieser Ressourcen, finden Sie in technischem Hinweis 23.
AFXRES.H
definiert Standardsymbole, z ID_FILE_NEW
. B. vom Framework verwendet und speziell in AFXRES.RC
. AFXRES.H
wird #include
auch verwendet, um einzuschließen WINRES.H
, die eine Teilmenge der WINDOWS.H
von Visual C++ generierten .RC
Dateien und AFXRES.RC
. Die definierten AFXRES.H
Symbole sind beim Bearbeiten der Anwendungsressourcendatei (MYAPP.RC
) verfügbar. Wird beispielsweise ID_FILE_NEW
für das File
New
Menüelement in der Menüressource der MYAPP.RC
Datei verwendet. Sie können diese frameworkdefinierte Symbole nicht ändern oder löschen.
Einschließen zusätzlicher Headerdateien
Die von AppWizard erstellte Anwendung enthält nur zwei Headerdateien: RESOURCE.H
und AFXRES.H
. Nur RESOURCE.H
anwendungsspezifisch. In folgenden Fällen müssen Sie möglicherweise zusätzliche schreibgeschützte Headerdateien einschließen:
Die Headerdatei wird von einer externen Quelle bereitgestellt, oder Sie möchten die Headerdatei für mehrere Projekte oder mehrere Bereiche desselben Projekts freigeben.
Die Headerdatei enthält Formatierungen und Kommentare, die Visual C++ beim Speichern der Datei nicht ändern oder herausfiltern soll. So möchten Sie beispielsweise #define-Direktiven beibehalten, die eine symbolische Arithmetik wie die folgende verwenden:
#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)
Sie können zusätzliche schreibgeschützte Headerdateien einschließen, indem Sie den Befehl "Ressource umfasst " verwenden, um die #include
Anweisung wie folgt als zweite Schreibschutzsymboldirektive anzugeben:
#include "afxres.h"
#include "second.h"
Das neue Dateibeziehungsdiagramm sieht nun wie folgt aus:
AFXRES.H
RESOURCE.H SECOND.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
AFXRES.RC
AFXPRINT.RC
Freigeben einer Headerdatei zwischen zwei .RC
Dateien
Möglicherweise möchten Sie eine Headerdatei zwischen zwei .RC
Dateien freigeben, die sich in verschiedenen Projekten befinden, oder möglicherweise dasselbe Projekt. Wenden Sie dazu die oben beschriebene Schreibgeschützte Direktiven auf beide .RC
Dateien an. In dem Fall, in dem sich die beiden .RC
Dateien für verschiedene Anwendungen (verschiedene Projekte) befinden, wird das Ergebnis im folgenden Diagramm veranschaulicht:
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
Der Fall, in dem die zweite Headerdatei von zwei .RC
Dateien in derselben Anwendung (Projekt) gemeinsam genutzt wird, wird weiter unten erläutert.
Verwenden mehrerer Ressourcendateien im selben Projekt
Visual C++ und der Ressourcencompiler unterstützen mehrere .RC
Dateien im selben Projekt über #include
Direktiven, die eine Datei in einer .RC
anderen enthalten. Mehrfache Schachtelung ist zulässig. Es gibt verschiedene Gründe, die Ressourcen Ihres Projekts in mehrere .RC
Dateien aufzuteilen:
Es ist einfacher, eine große Anzahl von Ressourcen unter mehreren Teammitgliedern zu verwalten, wenn Sie die Ressourcen in mehrere
.RC
Dateien aufteilen. Wenn Sie ein Quellcodeverwaltungspaket verwenden, um Dateien auszuchecken und Änderungen einzuchecken, erhalten Sie durch das Aufteilen der Ressourcen in mehrere.RC
Dateien eine bessere Kontrolle über die Verwaltung von Änderungen an Ressourcen.Wenn Sie Präprozessordirektiven wie
#ifdef
,#endif
und#define
für Teile Ihrer Ressourcen verwenden möchten, müssen Sie sie in schreibgeschützten Ressourcen isolieren, die vom Ressourcencompiler kompiliert werden.Komponentendateien
.RC
werden in Visual C++ schneller als eine zusammengesetzte.RC
Datei geladen und gespeichert.Wenn Sie eine Ressource mit einem Text-Editor in einer lesbaren Form Standard möchten, sollten Sie sie in einer
.RC
Datei trennen, die von den einzelnen Visual C++-Bearbeitungen getrennt ist.Wenn Sie eine benutzerdefinierte Ressource in einer Binär- oder Textform beibehalten müssen, die von einem anderen speziellen Daten-Editor interpretiert werden kann, sollten Sie sie in einer separaten
.RC
Datei speichern, damit Visual C++ das Format nicht in Hexadezimaldaten ändert. Die.WAV
(Sound)-Dateiressourcen im MFC Advanced Concepts-Beispiel SPEAKN sind ein gutes Beispiel.
Sie können die Kompilierungszeitdirektiven im Dialogfeld "Einschließen" einschließen SECOND.RC
:
#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
Das Ergebnis ist im folgenden Diagramm dargestellt:
RESOURCE.H AFXRES.H
\ /
\ /
MYAPP.RC
|
|
RES\MYAPP.RC2
SECOND.RC
AFXRES.RC
AFXPRINT.RC
Mithilfe von Kompilierungszeitdirektiven können Sie Ihre bearbeitbaren und nicht bearbeitbaren Ressourcen in mehreren .RC
Dateien organisieren, wobei die Standard MYAPP.RC
nichts anderes als #include
die anderen .RC
Dateien ausführt. Wenn Sie eine Visual Studio C++-Projektdatei .MAK
verwenden, sollten Sie die Standard-Datei .RC
in das Projekt einschließen, damit alle enthaltenen Ressourcen mit Ihrer Anwendung kompiliert werden.
Erzwingen von nicht bearbeitbaren Visual C++-Dateien
Die von AppWizard erstellte RES\MYAPP.RC2
Datei ist ein Beispiel für eine Datei, die Ressourcen enthält, die Sie nicht versehentlich in Visual C++ lesen und dann mit Verlust von Formatierungsinformationen zurückschreiben möchten. Um dieses Problem zu schützen, platzieren Sie die folgenden Zeilen am Anfang der RES\MYAPP.RC2
Datei:
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Visual C++
#endif //APSTUDIO_INVOKED
Wenn Visual C++ die .RC
Datei kompiliert, definiert sie sowohl als RC_INVOKED
auch APSTUDIO_INVOKED
. Wenn die von AppWizard erstellte Dateistruktur beschädigt ist und Visual C++ die oben genannte #error Zeile liest, meldet sie einen schwerwiegenden Fehler und bricht das Lesen der .RC
Datei ab.
Verwalten von Symbolen, die von mehreren visual C++-bearbeiteten Dateien gemeinsam genutzt werden .RC
Zwei Probleme treten auf, wenn Sie Ihre Ressourcen in mehrere .RC
Dateien aufteilen, die Sie separat in Visual C++ bearbeiten möchten:
Möglicherweise möchten Sie dieselben Symbole für mehrere
.RC
Dateien freigeben.Sie müssen verhindern, dass Visual C++ dieselben numerischen ID-Werte unterschiedlichen Ressourcen (Symbolen) zuweist.
Das folgende Diagramm veranschaulicht eine Organisation und .RC
.H
Dateien, die sich mit dem ersten Problem befassen:
MYAPP.RC
/ \
/ \
MYSTRS.H / MYSHARED.H \ MYMENUS.H
\ / / \ \ \
\ / / \ \ \
MYSTRS.RC MYMENUS.RC
In diesem Beispiel werden Zeichenfolgenressourcen in einer Ressourcendatei gespeichert, MYSTRS.RC
und Menüs werden in einer anderen MYMENUS.RC
Gespeichert. Einige Symbole, z. B. für Befehle, müssen möglicherweise in beiden Dateien genutzt werden. Beispielsweise kann es ID_TOOLS_SPELL
sich um die Menübefehls-ID für das Element "Rechtschreibung" in einem Menü "Extras" handeln, und es kann auch die Zeichenfolgen-ID der Eingabeaufforderung sein, die vom Framework in der Standard Fensterstatusleiste der Anwendung angezeigt wird.
Das ID_TOOLS_SPELL
Symbol wird in der freigegebenen Headerdatei gespeichert. MYSHARED.H
Sie Standard diese freigegebene Headerdatei manuell mit einem Text-Editor speichern; Visual C++ bearbeitet es nicht direkt. In den beiden Ressourcendateien MYSTRS.RC
und MYMENUS.RC
, wie weiter oben beschrieben, geben #include "MYSHARED.H"
Sie in den Schreibgeschützten Direktiven für MYAPP.RC
die Verwendung des Befehls "Ressource enthält" an.
Es ist am praktischsten, ein Symbol zu antizipieren, das Sie freigeben, bevor Sie versuchen, es zu verwenden, um eine Ressource zu identifizieren. Fügen Sie das Symbol zur freigegebenen Headerdatei hinzu, und wenn Sie die freigegebene Headerdatei noch nicht in die schreibgeschützten Direktiven für die .RC
Datei eingeschlossen haben, führen Sie dies vor der Verwendung des Symbols aus. Wenn Sie die Freigabe des Symbols auf diese Weise nicht erwartet haben, müssen Sie die #define Anweisung für das Symbol manuell (mit einem Text-Editor) verschieben, MYMENUS.H
z. B. bis zur MYSHARED.H
Verwendung in MYSTRS.RC
.
Wenn Sie Symbole in mehreren .RC
Dateien verwalten, müssen Sie auch Visual C++ dabei unterstützen, die gleichen ID-Numerischen Werte unterschiedlichen Ressourcen (Symbolen) zuzuweisen. Für jede bestimmte .RC
Datei weist Visual C++ inkrementell IDs in jeder der vier ID-Aufgaben zu Standard. Zwischen Bearbeitungssitzungen verfolgt Visual C++ die letzte ID, die sie in jedem der Aktionen zugewiesen ist Standard in der Symbolkopfzeilendatei für die .RC
Datei. Hier sehen Sie, was die APS_NEXT
Werte für eine leere (neue) .RC
Datei sind:
#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
ist der nächste Symbolwert, der für eine Dialogressource, Menüressource usw. verwendet wird. Der gültige Bereich für Ressourcensymbolwerte ist 1 bis 0x6FFF.
_APS_NEXT_COMMAND_VALUE
ist der nächste Symbolwert, der für eine Befehlsidentifikation verwendet wird. Der gültige Bereich für Befehlssymbolwerte ist 0x8000 bis 0xDFFF.
_APS_NEXT_CONTROL_VALUE
ist der nächste Symbolwert, der für ein Dialogfeld-Steuerelement verwendet wird. Der gültige Bereich für Symbolwerte für Dialogsteuerelemente ist 8 bis 0xDFFF.
_APS_NEXT_SYMED_VALUE
ist der nächste Symbolwert, der ausgegeben wird, wenn Sie manuell einen Symbolwert mithilfe des Befehls "Neu" im Symbolbrowser zuweisen.
Visual C++ beginnt mit etwas höheren Werten, die beim Erstellen einer neuen .RC
Datei den niedrigsten rechtlichen Wert aufweisen. AppWizard initialisiert diese Werte zudem in einem Format, das für MFC-Anwendungen geeignet ist. Weitere Informationen zu ID-Wertbereichen finden Sie unter Technical Note 20.
Jedes Mal, wenn Sie eine neue Ressourcendatei erstellen, auch im selben Projekt definiert Visual C++ die gleichen _APS_NEXT_
Werte. Wenn Sie also mehrere Dialogfelder in zwei verschiedenen .RC
Dateien hinzufügen, ist es höchstwahrscheinlich, dass demselben #define Wert unterschiedliche Dialogfelder zugewiesen werden. Beispielsweise IDD_MY_DLG1
kann in der ersten .RC
Datei die gleiche Zahl, 101, wie IDD_MY_DLG2
in einer zweiten .RC
Datei zugewiesen werden.
Um dieses Problem zu vermeiden, sollten Sie für jeden der vier Aktionen einen separaten numerischen Bereich reservieren Standard von IDs in den jeweiligen .RC
Dateien. Legen Sie die Bereiche fest, indem Sie die _APS_NEXT
Werte in den einzelnen .RC
Dateien manuell aktualisieren, bevor Sie mit dem Hinzufügen von Ressourcen beginnen. Wenn die erste .RC
Datei beispielsweise die Standardwerte _APS_NEXT
verwendet, können Sie der zweiten .RC
Datei die folgenden _APS_NEXT
Werte zuweisen:
#define _APS_NEXT_RESOURCE_VALUE 2000
#define _APS_NEXT_COMMAND_VALUE 42000
#define _APS_NEXT_CONTROL_VALUE 2000
#define _APS_NEXT_SYMED_VALUE 2000
Natürlich ist es dennoch möglich, dass Visual C++ so viele IDs in der ersten .RC
Datei zuweist, dass die numerischen Werte beginnen, die für die zweite .RC
Datei reservierte überlappen. Sie sollten ausreichend große Bereiche reservieren, damit diese Kollision nicht geschieht.
Verwalten von Abhängigkeiten zwischen .RC
, .CPP
und .H
Dateien
Wenn Visual C++ eine .RC
Datei speichert, werden auch Symboländerungen in der entsprechenden RESOURCE.H
Datei gespeichert. Alle Dateien.CPP
, die auf Ressourcen in der .RC
Datei verweisen, müssen verwendet werden#include
, um die RESOURCE.H
Datei einzuschließen, in der Regel aus der Standard Headerdatei Ihres Projekts. Diese Einbeziehung führt zu einem unerwünschten Nebeneffekt aufgrund des internen Projektmanagements der Entwicklungsumgebung, das Quelldateien auf Headerabhängigkeiten überprüft. Jedes Mal, wenn Sie in Visual C++ ein neues Symbol hinzufügen, müssen alle Dateien, die .CPP
Direktiven enthalten #include "RESOURCE.H"
, neu kompiliert werden.
Visual C++ umgeht die Abhängigkeit, RESOURCE.H
indem der folgende Kommentar als erste Zeile der RESOURCE.H
Datei eingeschlossen wird:
//{{NO_DEPENDENCIES}}
Die Entwicklungsumgebung interpretiert diesen Kommentar, indem die Änderungen RESOURCE.H
ignoriert werden, sodass abhängige .CPP
Dateien nicht neu kompiliert werden müssen.
Visual C++ fügt beim Speichern der Datei immer die //{{NO_DEPENDENCIES}}
Kommentarzeile zu einer .RC
Datei hinzu. In einigen Fällen kann die Umgehung der Buildabhängigkeit RESOURCE.H
zu Laufzeitfehlern führen, die zur Verknüpfungszeit nicht erkannt wurden. Wenn Sie z. B. den Symbolbrowser verwenden, um den numerischen Wert zu ändern, der einem Symbol für eine Ressource zugewiesen ist, wird die Ressource zur Laufzeit der Anwendung nicht richtig gefunden und geladen, wenn die .CPP
Datei, die auf die Ressource verweist, nicht neu kompiliert wird. In solchen Fällen sollten Sie alle .CPP
Dateien, die Sie kennen, explizit neu kompilieren, von den Symboländerungen in RESOURCE.H
oder wählen Sie "Alle neu erstellen" aus. Wenn Sie symbolwerte für eine bestimmte Gruppe von Ressourcen häufig ändern müssen, ist es wahrscheinlich bequemer und sicherer, diese Symbole in eine separate schreibgeschützte Kopfzeilendatei aufzuteilen, wie im obigen Abschnitt beschrieben, einschließlich zusätzlicher Headerdateien.
So verwaltet Visual C++ Set Includes Information
Wie oben erläutert, können Sie mit dem "Gruppe enthält"-Befehl im Menü "Datei" drei Typen von Informationen angeben:
Symbolheaderdatei
Direktiven für schreibgeschützte Symbole
Kompilierzeitanweisungen
In der folgenden Tabelle wird beschrieben, wie Visual C++ diese Informationen in einer .RC
Datei Standard enthält. Sie benötigen diese Informationen nicht für die Verwendung von Visual C++, aber es kann Ihr Verständnis verbessern, damit Sie das Feature "Set Includes" sicherer verwenden können.
Jede der oben genannten drei Typen von Set Includes-Informationen wird in der .RC
Datei in zwei Formen gespeichert: (1) als #include
oder andere direktiven, die vom Ressourcencompiler interpretiert werden können, und (2) als spezielle TEXTINCLUDE
Ressourcen, die nur von Visual C++ interpretiert werden können.
Die Ressource dient zum sicheren Speichern von TEXTINCLUDE
Set Include-Informationen in einem Formular, das im Dialogfeld "Set Includes" von Visual C++ leicht präsentierbar ist. TEXTINCLUDE
ist ein von Visual C++ definierter Ressourcentyp . Visual C++ erkennt drei spezifische TEXTINCLUDE
Ressourcen mit den Ressourcenidentifikationsnummern 1, 2 und 3:
TEXTINCLUDE Ressourcen-ID |
Typ der "Gruppe enthält"-Informationen |
---|---|
1 | Symbolheaderdatei |
2 | Direktiven für schreibgeschützte Symbole |
3 | Kompilierzeitanweisungen |
Jede der drei Typen von Set Includes-Informationen wird durch die Standard MYAPP.RC
- und RESOURCE.H
Dateien veranschaulicht, die von AppWizard erstellt wurden, wie unten beschrieben. Die zusätzlichen \0
Token und ""
Token zwischen BEGIN
und END
Blöcken sind von der RC-Syntax erforderlich, um null beendete Zeichenfolgen und das doppelte Anführungszeichen anzugeben.
Symbolheaderdatei
Die Form der vom Ressourcencompiler interpretierten Informationen der Symbolheaderdatei ist einfach eine #include
Anweisung:
#include "resource.h"
Die entsprechende TEXTINCLUDE
Ressource lautet:
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
Direktiven für schreibgeschützte Symbole
Schreibgeschützte Symboldirektiven sind oben MYAPP.RC
in der folgenden vom Ressourcencompiler interpretierten Form enthalten:
#include "afxres.h"
Die entsprechende TEXTINCLUDE
Ressource lautet:
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
Kompilierzeitanweisungen
Kompilierungszeitdirektiven werden am Ende der MYAPP.RC
folgenden Vom Ressourcencompiler interpretierten Form eingeschlossen:
#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
Die #ifndef APSTUDIO_INVOKED
Direktive weist Visual C++ an, Kompilierungszeitdirektiven zu überspringen.
Die entsprechende TEXTINCLUDE
Ressource lautet:
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
Siehe auch
Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet