So überlisten Sie den Ressource-Editor von Visual Studio

Veröffentlicht: 27. Jan 2002 | Aktualisiert: 15. Jun 2004

Von Paul DiLascia

Wenn bei der Bearbeitung von Ressourcen im Visual Studio zusätzlich eingefügte #include-Zeilen verschwinden, hilft ein kleiner Trick.

Diesen Artikel können Sie hier lesen dank freundlicher Unterstützung der Zeitschrift:

Bild01

Frage

Ich möchte in einer Ressourcedatei meines Projekts mit #include eine Kopfdatei aufnehmen. Ich habe es in meiner .rc-Datei mit einer Zeile wie dieser probiert:

#include "MyFile.h"

Das funktioniert zwar ganz ordentlich, aber wenn ich nun die Ressourcen im Visual Studio öffne, löscht es mir meine zusätzliche Zeile. Ich muss eine Datei von einem Dritten einbinden, die ID-Symbole für bestimmte Menüpunkte enthält.

 

Antwort

Es ist schon erstaunlich, wie diese verdammte IDE gelegentlich den Code zerrupft, nicht wahr? Aber keine Sorge, es findet sich immer eine Lösung. Wenn das App Studio Ihre .rc-Datei öffnet (das ist übrigens der alte Name für den Ressourceneditor vom Visual Studio), führt es einige Vorarbeiten durch. Und wenn es Ihre Datei abspeichert, dann speichert es sozusagen eine regenerierte Form der alten Datei, die es nach den eigenen Regeln erstellt hat. Insbesondere besteht das App Studio darauf, eine und nur eine Kopfdatei zu benutzen, mit der alle Ressourcensymbole eingebunden werden. Im Normalfall heißt diese Datei resource.h. Sie können diesen Namen aber ändern, indem Sie die Ressourcen von MyApp mit der rechten Maustaste anklicken und Ressourcen-Includes wählen. Und wenn das App Studio Ihre Ressourcendatei schreibt, dann schreibt es genau eine und nur eine #include-Anweisung. Jedes zusätzliche #include, das Sie zuvor von Hand eingetragen haben, fällt unter den Tisch.
Lässt sich das ändern? Ja. Vielleicht ist Ihnen schon aufgefallen, wie das App Studio spezielle Informationen in der Ressourcendatei unterbringt. Sie haben vermutlich schon mindestens einmal im Leben einen Dialog mit Rändern entwickelt. Haben Sie sich jemals gefragt, wo das App Studio eigentlich die Werte für die Ränder ablegt? In der DIALOG-Anweisung jedenfalls nicht, denn die hat keinen MARGINS-Parameter. Nein, das App Studio legt die Informationen über die Ränder in einem speziellen Abschnitt ab:

#ifdef APSTUDIO_INVOKED 
GUIDELINES DESIGNINFO DISCARDABLE  
BEGIN 
    IDD_MYDIALOG, DIALOG 
    BEGIN 
        LEFTMARGIN, 8 
        RIGHTMARGIN, 502 
        TOPMARGIN, 8 
        BOTTOMMARGIN, 273 
    END 
END 
#endif // APSTUDIO_INVOKED

APSTUDIO_INVOKED ist definiert, wenn das App Studio Ihre .rc-Datei bearbeitet, aber nicht, wenn der normale Ressourcencompiler diese Datei kompiliert. Der Ressourcencompiler bekommt GUIDELINES nie zu sehen. Nur das App Studio. Warum rede ich nun über die GUIDELINES, wo doch nach #include-Dateien gefragt wurde? Weil die Antwort auf die Frage in APSTUDIO_INVOKED liegt. Sie brauchen Ihre zusätzliche #include-Anweisung nur folgendermaßen zu verpacken:

#ifndef APSTUDIO_INVOKED // falls NICHT definiert 
#include "MyOtherHeader.h" 
#endif

Nun ignoriert das App Studio Ihre #include-Anweisung, weil APSTUDIO_INVOKED definiert ist, wenn es läuft. Wenn der RC-Compiler aber Ihre Datei verarbeitet, ist APSTUDIO_INVOKED nicht mehr definiert und das #include findet statt. Mehr noch - und das ist der entscheidende Punkt - das App Studio achtet sorgfältig darauf, dass es Ihre #include-Anweisung ebenfalls mit abspeichert, wenn es die .rc-Datei speichert. "Huch - dieses Zeugs ist nicht für mich... ist wohl besser, es nicht einfach zu löschen." Neugierige Geister könnten sich fragen, warum das App Studio überhaupt auf die Idee kommt, gültige Codezeilen zu löschen. Aber das ist ein anderes Thema.