T-13: Versionsprüfung
Nur noch 13 Tage bis zum Windows 7 Launch. Was ist eigentlich die größte Herausforderung beim Wechsel von Windows XP zu Windows 7? Die eigentliche Versionsprüfung. Viele Anwendungen prüfen intern, auf welchem Betriebssystem sie eigentlich ausgeführt werden. Je nach Version des Betriebssystems werden dann bestimmte Funktionen aktiviert bzw. deaktiviert. Leider ist die Art und Weise der Versionsprüfung oft ein Grund, der die Ausführung der Anwendung auf Windows Vista oder Windows 7 verhindert. Folgende Regeln sollte man beachten, wenn man unbedingt eine Versionsprüfung durchführen muss:
Mit diesem Vorgehen lassen sich bereits sehr viele Anwendungen auf Windows 7 portieren. Warum geht das so einfach? Weil Windows 7 wie auch schon Windows Vista viele Mechanismen für die Kompatibilität mitbringen und diese auch sehr gut funktionieren. Leider können diese Mechanismen oft nicht aktiv werden, da Entwicklerdies durch harte Prüfungen aushebeln. Tipp: Version nur im äußersten Notfall prüfen, besser ist auf Features zu prüfen: C++
#include <windows.h>
Das folgende Codebeispiel demonstriert VerifyVersionInfo zum Prüfen des Betriebssystems auf eine bestimmte erforderliche Minimalversion (XP SP2): C++
#include <windows.h>
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, op );
return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR
| VER_SERVICEPACKMINOR, dwlConditionMask);
.NET Framework-Entwickler können die Operatoren ==, !=, <=, <, >, >= auf dem Objekt Environment.OSVersion.Version verwenden: C#
if (Environment.OSVersion.Version < new Version(5, 1))
Prüfen auf Features anstelle auf die Version Wie bereits erwähnt, ist es besser auf Funktionen des Systems als hart auf eine Versionsnummer zu prüfen. Das liegt schlichtweg daran, dass man durch die Versionsnummer nicht auf den Funktionsumfang eines Betriebssystems schließen kann. Es können z.B. Features deaktiviert oder nachinstalliert worden sein. Auch können Services Packs oder verteilbare DLLs nachgeliefert worden sein, die nicht an eine bestimmte Versionsnummer gebunden sind. Das wird z.B. in Zukunft bei Vista der Fall sein, dort werden einige Features bereit gestellt, die erst mit Windows 7 entwickelt wurden, wie z.B. die Ribbon. Für C++-Entwickler bedeutet dies, besser auf GetVersion() zu verzichten und lieber auf die Funktion zu prüfen. Ist eine benötigte Funktion nicht vorhanden, sollte die Anwendung dennoch weiter ausgeführt werden, ggf. mit reduziertem Umfang. Für Win32 sollte folgender Mechanismus verwendet werden:
Das folgende Beispiel demonstriert diesen Mechanismus: C++
// define function pointer type
LARGE_INTEGER liDueTime;
// Get module handle to a module which is already loaded
// Get Address of function
// Check if the function exists
// Call function
Anwendungen, die in Managed Code geschrieben sind, haben es da etwas leichter. Stehen Funktionen nicht zur Verfügung, die auf Win32 APIs mittels P/Invoke zugreifen, gibt es entweder eine EntryPointNotFoundException oder DllNotFoundException. Das Video des Tages Weiterführende Links: |