Komfortabler Dateimanager mit vielen Funktionen

Erfundene Kompatibilitätsprobleme

By Sven on 07.10.2014 - 15:10 in Windows 10

Die Vorstellung von Windows 10 hat viele überrascht, die meisten hatten mit Windows 9 gerechnet. Microsoft begründet den Sprung damit, dass die vielen Neuerungen den Versionssprung rechtfertigen. Sollte das stimmen, dann können wir noch großes erwarten. Der derzeitige Umfang der technischen Preview ist diesen Sprung für mich noch nicht wert.

Letzte Woche hat dann auf Reddit ein angeblicher Microsoft-Entwickler den wahren Grund preisgegeben. Schuld am Auslassen der Nummer 9 soll ein häufig vorkommender Quellcodeschnipsel mit dem Inhalt

if (osName.startsWith("Windows 9")

und die damit zu erwartenden Kompatibilitätsprobleme sein. Viele Seiten haben über die tausenden schlampigen Programmierer berichtet.

Die wenigsten haben sich aber bemüht, die etwaigen Kompatibilitätsprobleme zu hinterfragen. Searchcode liefert zwar mehr als 4300 Ergebnisse, die wenigsten entsprechen aber dem Suchmuster.

Die fragwürdigen Zeilen finden sich im Java Development Kit (JDK) von Oracle und in anderen Java-Programmen. Sie beziehen sich auf den Windows-Namen, den die Java-Laufzeitumgebung anhand der jeweiligen Windows-Version zusammenstellt. Die Laufzeitumgebung ruft dafür die Windows-Funktion GetVersionEx und auf wertet die Rückgabe aus. Der entsprechende Codeschnipsel für die aktuelle Windows-Generation (Versionsnummer 6) schaut so aus:

else if (ver.dwMajorVersion == 6) {
if (ver.wProductType == VER_NT_WORKSTATION) {
 switch (ver.dwMinorVersion) {
 case 0: sprops.os_name = "Windows Vista"; break;
 case 1: sprops.os_name = "Windows 7"; break;
 case 2: sprops.os_name = "Windows 8"; break;
 case 3: sprops.os_name = "Windows 8.1"; break;
 default: sprops.os_name = "Windows NT (unknown)";
 }

Windows 10 meldet sich mit 6.4. Dieser Fall ist in den JDKs 7 und 8 noch nicht eingearbeitet. Also wird die default-Marke angesprungen und der von der Java-Laufzeit bereitgestellte Name wäre momentan ‚Windows NT (unknown)‘. In späteren Java-Versionen erfolgt hier sicher noch eine Anpassung. Die Entscheidung über den neuen gewählten Namen liegt aber ganz bei Oracle. Sollte Oracle Kompatibilitätsprobleme befürchten, dann hätte es ihnen auch freigestanden, einen kompatibleren Namen (z.b. Windows Nine) zu verwenden.

Mit Windows 8.1 hat Microsoft aber auch die Funktionalität von GetVersionEx geändert. Bis einschließlich Windows 8.0 war es so, dass GetVersionEx immer die aktuelle Versionsnummer zurückgegeben hat. Ab Windows 8.1 hängt die zurückgegebene Versionsnummer davon ab, ob sich die Anwendung per Manifest als kompatibel ausweist. Fehlt der Kompatibilitätseintrag im Manifest oder hat die Anwendung keins, dann gibt sich Windows 10 auch nur als Windows 8.0 zu erkennen. Ältere Anwendungen haben also keine bösen Überraschungen zu befürchten.

Dies würde im Moment auch die Abfrage im Java-JDK betreffen. Aufgrund des fehlenden Kompatibilitätseintrags für Windows 10 in der Java-Laufzeitumgebung gibt

public class Main
{
     public static void main(String[ ] args)
     {
         String osName = System.getProperty("os.name");
         System.out.println(osName);
     }
}

derzeit unter Windows 10 den Text

Windows 8.1

aus.

Es können keine Kommentare abgegeben werden.

Top