Komfortabler Dateimanager mit vielen Funktionen

Windows Vista SDK im VC 6 einbinden

By Sven on 08.03.2007 - 11:29 in Visual Studio 6

Das letzte Platform SDK, welches noch anstandslos mit dem VC 6 funktioniert, ist das für Windows Server 2003 vom Februar 2003. Alle nachfolgenden SDKs bringen LIB-Dateien in einem neueren Format mit (VS 2003), welche der Linker vom VC 6 nicht mehr verwenden kann.

Will man also weiter mit dem VC 6 arbeiten und trotzdem nicht auf die neuen Definitionen für Vista verzichten, so muss man diese aus den Include-Dateien des Vista-SDKs zusammenklauben und in eigene Headerdateien stecken. Auf Dauer ist dies aber recht mühsam, da es teilweise mehrstufige Abhängigkeiten gibt. Daher habe ich nach einer Möglichkeit gesucht, dieses Gefrickel zu umgehen.

Die Lösung ist denkbar einfach: Man verwendet die Headerdateien vom Vista-SDK und die LIB-Dateien vom W2k3-SDK. Die alten LIB-Dateien sind kein großer Nachteil, da neuere Funktionen, die nur ab Vista verfügbar sind, sowieso dynamisch eingebunden werden sollten. Ansonsten versagt die Anwendung auf älteren Systemen ihren Dienst.

Hier nun die Schritt-für-Schritt-Anleitung:

  1. Das include-Verzeichnis im alten PSDK auf “include.old” umbenennen.
  2. Das include-Verzeichnis vom Vista-SDK in das alte PSDK kopieren
  3. Die strsafe.h im neuen include-Verzeichnis durch die aus “include.old” ersetzen.
  4. Alle .idl-Dateien im neuen include-Verzeichnis löschen und durch die aus “include.old” ersetzen.

Beim ersten Kompilieren werden bei höchster Warnstufe (W4) noch vier Warnungen in der WinGDI.h und WinNT.h ausgegeben. Die in der WinGDI.h werden durch ein dem VC 6 unbekanntes pragma ausgelöst, eine Auskommentierung der beiden Zeilen hilft. In der WinNT.h werden zwei Funktionen ohne Rückgabewert angemeckert, Abhilfe schafft hier eine temporäre Deaktivierung der Meldung 4035 für die beiden Funktionen.

Das Ersetzen der .idl-Dateien ist nötig, da der alte MIDL-Compiler das neue Schlüsselwort “annotation” nicht versteht und das Kompilieren an dieser Stelle abbricht. Die neue strsafe.h benutzt teilweise neue Funktionskennungen und ist daher mit der alten strsafe.lib nicht mehr kompatibel.

Neue CLSID- bzw. IID-Wert für Vista findet der Linker in der Regel in den LIB-Dateien, diese stehen uns hier aber nicht zur Verfügung. Daher muss man sich diese selbst definieren. Der Aufwand ist aber recht gering, wie das folgende Beispiel zeigt:

#define MFX_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        EXTERN_C const GUID DECLSPEC_SELECTANY name = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
		
MFX_DEFINE_GUID(CLSID_FileOpenDialog, 0xDC1C5A9C, 0xE88A, 0x4dde, 0xA5, 0xA1, 0x60, 0xF8, 0x2A, 0x20, 0xAE, 0xF7);
MFX_DEFINE_GUID(CLSID_FileSaveDialog, 0xC0B4E2F3, 0xBA21, 0x4773, 0x8D, 0xBA, 0x33, 0x5E, 0xC9, 0x46, 0xEB, 0x8B);

Es gibt 4 Kommentare zu diesem Beitrag

Trackback URL | RSS-Feed für Kommentare

  1. Kay sagt:

    WOW! Danke, dass Du Dir die Arbeit gemacht hast und das hier veröffentlichst!!! 🙂

  2. Sven sagt:

    Kein Problem. Ich weiß ja, dass es da draußen noch den einen oder anderen Legacy-Programmierer gibt, der sich über solche Infos freut. 🙂

    Man sollte übrigens auch auf die Strukturgrößen achten, die sich bei einigen Strukturen geändert haben. Bei den Common Controls sind das insbesondere LVTILEINFO und LVGROUP. Hier empfiehlt sich die Initialisierung von .cbSize mit LVTILEINFO_V5_SIZE bzw. LVGROUP_V5_SIZE, wenn man zu XP kompatibel sein will.

  3. Sven sagt:

    Die NONCLIENTMETRICS-Struktur wurde übrigens auch erweitert. Man sollte daher .cbSize nur mit der vorherigen Größe initialisieren, sonst schlägt der Aufruf auf früheren Systemen fehl.

  4. Anonymous sagt:

    Funktioniert nicht mehr mit dem akuellen SDK (07.10.08).
    In specstring.h wird eine sal.h eingebunden, die erst mit Visual Studio 2005
    dabei ist.

Top