MFC abgespeckt
Letzte Woche Montag ist das Service Pack 1 für Visual Studio 2008 erschienen. Wichtige Neuerungen für den C++-Entwickler sind sicherlich die Unterstützung von TR1 und das UI-Update für die MFC. Nach den Installationsproblemen mit dem im April veröffentlichten Feature Pack wollte ich eigentlich erst einmal die Erfahrungen anderer abwarten.
Daraus wurde dann doch nichts. Zu Testzwecken hatte ich mir ein VS 2008 in einer VM installiert und anschließend das SP1 eingespielt. Probleme gab es keine, die Microsoft-Entwickler haben aus dem Feature Pack-Dilemma gelernt und diesmal wieder ausreichend getestet.
Erfreulicherweise hat Microsoft auch das Konzept beibehalten, die bisherige MFC sowie die neuen UI-Klassen nicht zu verzahnen. Somit kann man die Einbindung der neuen Klassen durch Entfernen der entsprechenden Sektion im Makefile sehr einfach entfernen und die MFC weiter im bisherigen Umfang verwenden. Nach dem Löschen der nicht mehr benötigten Dateien hat man wieder ein schlankes und übersichtliches MFC-Verzeichnis.
Neben den neuen UI-Klassen gab es in der Standard-MFC nur kleinere Korrekturen. Die in afximpl.h definierten Konstanten CX_BORDER und CY_BORDER wurden nach AFX_CX_BORDER und AFX_CY_BORDER umbenannt. Bei einigen Zeigern fehlte bisher die Prüfung gegen NULL, das wurde mit dem SP1 auch behoben.
Nach den positiven Erfahrungen bei der VM-Installation habe ich das SP1 dann auch auf meinem Entwicklungsrechner eingespielt sowie C/C++-Laufzeit und MFC kompiliert. Die Anleitungen für die C/C++-Laufzeit sowie für die MFC sind weiter gültig, zusätzlich müssen für einen manifestlosen Einsatz die Linkerkommentare in appmodul.cpp
#pragma comment(linker, "/include:__forceMFCManifestRTM")
und crtdll.c
#pragma comment(linker, "/include:__forceCRTManifestRTM")
auskommentiert werden. Ansonsten beschwert sich der Linker beim Erstellen der CRT sowie beim Erstellen einer MFC-Anwendung über einen fehlenden Import. Bisher habe ich leider noch nicht herausgefunden, was diese beiden Linkerkommentare bewirken sollen. Die RTM-Version kam noch ohne diese aus.
Musst Du nicht auskommentieren 😉
Du kannst sie einfach erfüllen durch.
__declspec(selectany) int _forceCRTManifestRTM;
__declspec(selectany) int _forceMFCManifestRTM;
__declspec(selectany) int _forceMFCManifestCUR;
Siehe http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/
Auch eine Alternative. 🙂
Mir ist das Auskommentieren aber lieber, weil damit gleich das Übel mitsamt den Wurzeln herausgerissen wird. 😀
Aber meine Methode benötigt keinen Eingriff in die Sourcen der CRT und keinen eigenen Build…
Da hast Du Recht.
Grund für meine eigenen Builds: Das Ergebnis ist eine völlig manifestlose CRT, die ohne Verrenkungen im Anwendungsverzeichnis abgelegt werden kann. Die MFC habe ich schon vor ein paar Jahren so erweitert, dass Dialoge und Strings wahlweise in einer bestimmten Sprache geladen werden können, wenn die Module Ressourcen in mehreren Sprachen enthalten (z.B. Deutsch und Englisch). Das komplette Speichern aller Einstellungen in XML-Dateien ist ohne Anpassung leider auch nicht möglich.