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 freigeben

  • Wie unterteilen Sie Projektressourcen in mehrere .RC Dateien

  • Wie verwalten Sie (und die Tools) Buildabhängigkeiten zwischen .RC, .CPPund .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, .CPPund .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.RC2diese 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 FileNew 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, #endifund #definefü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_INVOKEDauch 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.RCund Menüs werden in einer anderen MYMENUS.RCGespeichert. 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.RCdie 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, .CPPund .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