MSVC: afxres.h vs winresrc.h

Da arbeitet man schier ewig mit Visual Studio an einem C++ Projekt, und eines Tages ist es so weit: Man bekommt einen neuen PC, installiert MSVC, lädt sein Projekt, kompiliert … und dann erscheint die Meldung:

fatal error RC1015: cannot open include file 'afxres.h'.

Wie kann das nur sein?
Warum braucht eine Resource-Datei (*.rc) diesen Header und warum existiert er plötzlich nicht mehr?


Die Lösung

Handelt es sich um ein MFC Projekt (denn afxres.h stammt aus dieser Richtung), dann hat man vergessen den MFC-Support bei der Installation von Visual Studio zu installieren. Manchmal soll auch C++/CLI notwendig und deshalb mitinstalliert sein.
Also Visual Studio Installer aufrufen und die fehlenden Haken für die Nachinstallation setzen.

Es kommt aber auch gerne vor, dass eine Resource-Datei den Header “versehentlich” einfordert und ihn gar nicht braucht. Dann sollte die Problem-Include-Zeile durch
#include <winresrc.h>
ersetzt werden.

Wozu das alles?

In einer Resource-Datei stehen viele selbst definierte Symbole, unter denen dann Texte, Symboldatei-Links (*.ico) oder Menü- und Dialogeinträge definiert werden. Und nicht zu vergessen, die VS_VERSION_INFO Struktur, die Metainformationen über Datei-Version und Hersteller standardisiert in eine EXE oder DLL einbettet.

All diese Resource-Einträge mit ihren Text-Namen sind nichts anderes als C-Makros, die in der Regel auf Integerkonstanten verweisen.

Und genau deshalb müssen Header eingebunden werden, die diese Makros definieren.

winresrc.h ist eigentlich der korrekte Header für eine Windows-Applikation, doch Bibliotheken wie MFC und ATL stellen ihre eigenen Wrapper bereit, um eigene Zusätze beizumengen, nachdem sie selbst intern winresrc.h einbinden. afxres.h macht das auch so.

Fazit

Es passiert mir auch alle heiligen Zeiten wieder, dass ich über das Problem stolpere, mich wundere, dann nachdenke und mir noch einfällt:

Ah, da war doch was … aber was … ?

Hiermit hätte ich das mal auf den Blog gestellt und hoffe, dass ich mich an ihn erinnere, wenn mir afxres.h das nächste mal vor die Füße läuft.