AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Falscher Product Type in OSVersionInfoEx
Thema durchsuchen
Ansicht
Themen-Optionen

Falscher Product Type in OSVersionInfoEx

Ein Thema von Nersgatt · begonnen am 7. Dez 2012 · letzter Beitrag vom 24. Dez 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Falscher Product Type in OSVersionInfoEx

  Alt 7. Dez 2012, 09:47
Moin,

ich ermittle wie folgt die Windowsversion
Delphi-Quellcode:
function GetOSVersionInfoEx : TOSVersionInfoEx;
var
  OSVersionInfo : TOSVersionInfo absolute Result;
  Done : Boolean;
begin
  FillChar(Result, SizeOf(Result), #0);
  Done := False;
  try
    Result.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
    Done := GetOSVersionEx(Result);
  except
  end;
  if not(Done) then
  begin
    try
      FillChar(Result, SizeOf(Result), #0);
      Result.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
      GetVersionEx(OSVersionInfo);
    except
    end;
  end;
end;

function GetWinVersion : string;
var
  OSInfo : TOSVersionInfoEx;
begin
  Result := 'Unbekannte Windows-Version';

  OSInfo := GetOSVersionInfoEx;

  case OSInfo.dwPlatformId of
    VER_PLATFORM_WIN32s:
      begin
        Result := 'Win32s';
      end;
    VER_PLATFORM_WIN32_WINDOWS:
      begin
        if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 0) then
          Result := 'Windows 95';
        if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 10) then
          Result := 'Windows 98';
        if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 90) then
          Result := 'Windows Millennium Edition';
      end;
    VER_PLATFORM_WIN32_NT:
      begin
        if (OSInfo.dwMajorVersion = 4) and (OSInfo.dwMinorVersion = 0) then
          Result := 'Windows NT';
        if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 0) then
          Result := 'Windows 2000';
        if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 1) then
          Result := 'Windows XP';

        if (OSInfo.dwMajorVersion = 5) and (OSInfo.dwMinorVersion = 2) then
        begin
          if GetSystemMetrics(SM_SERVERR2) <> 0 then
            Result := 'Windows Server 2003 "R2"'
           else
             if (OSInfo.wProductType = VER_NT_WORKSTATION) then
               Result := 'Windows XP x64'
             else
               if OSInfo.wSuiteMask = VER_SUITE_WH_SERVER then
                 Result := 'Windows Home Server'
               else
                 Result := 'Windows Server 2003';
        end;

        if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 0) then
        begin
          if (OSInfo.wProductType = VER_NT_WORKSTATION) then
            Result := 'Windows Vista'
          else
            Result := 'Windows Server 2008';
        end;

        if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 1) then
        begin
          if (OSInfo.wProductType = VER_NT_WORKSTATION) then
            Result := 'Windows 7'
          else
            Result := 'Windows Server 2008 R2';
        end;

        if (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 2) then
        begin
          if (OSInfo.wProductType = VER_NT_WORKSTATION) then
            result := 'Windows 8'
          else
            result := 'Windows Server 2012';
        end;


        if (OSInfo.wSuiteMask and VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL then
          Result := Result + ' Home Edition'
        else
          Result := Result + ' Professional';

      end;
  end;
  Result := Trim(Result + ' ' + OSInfo.szCSDVersion);
end;
Was ich nicht verstehe: mein Programm läuft auf einem Windows 7 in einer virtuellen Maschine. Nach der Zeile (OSInfo.dwMajorVersion = 6) and (OSInfo.dwMinorVersion = 1) hab ich in OSInfo.wProductType ein 0 stehen. Ich würde hier eine 1 (=VER_NT_WORKSTATION) erwarten. Was mache ich falsch?

Danke!
Jens
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Falscher Product Type in OSVersionInfoEx

  Alt 7. Dez 2012, 10:05
Hat wahrscheinlich nichts mit deinem Problem zu tun, aber wenn deine Except-Abschnitte leer sind, kannst du gleich das ganze try-expect Konstrukt weglassen. Davon mal abgesehen, dass WinAPI Funktionen keine Delphi Exceptions werfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Falscher Product Type in OSVersionInfoEx

  Alt 7. Dez 2012, 10:09
Hat wahrscheinlich nichts mit deinem Problem zu tun, aber wenn deine Except-Abschnitte leer sind, kannst du gleich das ganze try-expect Konstrukt weglassen. Davon mal abgesehen, dass WinAPI Funktionen keine Delphi Exceptions werfen.
Völlig korrekt. Das passiert, wenn man Code nicht gründlich genug liest, bevor man ihn verwendet. Danke schon mal für den Hinweis.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: Falscher Product Type in OSVersionInfoEx

  Alt 10. Dez 2012, 15:42
Soweit ich es sehe machst du nix falsch. Ich arbeite derzeit auch wiedermal an einer Klasse die wir hier benutzen und zumindest bis Windows 7 (inklusive), mache ich es genauso wie du.

Mir sind aber zwei Details aufgefallen:
  1. Deine Funktion (GetOSVersionEx) ist nicht die API-Funktion (GetVersionEx) welche ich erwarten würde. Im zweiten Aufruf, wo es die erwartbare API-Funktion ist, ignorierst du den zurückgegebenen Wert.
  2. Du wertest einen Boolean (1-Byte) aus, statt wie es zumindest die API erwarten würde, einen LongBool (BOOL, i.e. 4-Byte).

Dann noch zwei Fragen:
  • Was gibt SizeOf(TOSVersionInfoEx) zurück?
  • Kompilierst du die Unicode-Version oder ANSI? Lt. Delphiversion würde ich Unicode vermuten.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#5

AW: Falscher Product Type in OSVersionInfoEx

  Alt 10. Dez 2012, 22:57
Hallo,

dieses Thema ist doch schon so alt wie Nachbar's Katze. Warum macht man denn nicht mal was, das jeder einfach verwenden kann, anstatt dass jeder sein eigenes Süppchen kocht?

Da ich heute auch mal wieder an dem Thema dran war, hab ich das Beispiel ein bischen angepasst und das Ergebnis mal ran gehängt. Scheint alles zu funktionieren.
Angehängte Dateien
Dateityp: pas RuWinVer2012.pas (9,3 KB, 116x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: Falscher Product Type in OSVersionInfoEx

  Alt 11. Dez 2012, 03:09
Warum macht man denn nicht mal was, das jeder einfach verwenden kann, anstatt dass jeder sein eigenes Süppchen kocht?
Gute Frage. Vermutlich weil diejenigen welche es machen zu strenge Lizenzen oder keine Lizenzen wählen? Anders kann ich es mir nicht vorstellen.

Und: Überraschung, Überraschung ... auch deine Unit darf man nicht legal von anderen verwenden, da sie dem deutschen Urheberrecht unterliegt und du keine Lizenzbedingungen (ala MIT, BSD, X11, zlib, GPL) angegeben hast unter denen die Unit verwendet werden darf. Also: selber besser machen ...

Da ich heute auch mal wieder an dem Thema dran war, hab ich das Beispiel ein bischen angepasst und das Ergebnis mal ran gehängt. Scheint alles zu funktionieren.
Ich versuche mich auch bei dir nochmals an dem Hinweis: Boolean ist nicht BOOL (aka LongBool). Warum ist das relevant? Weil bspw. der Wert $100 als BOOL auch True ist, dein Code dann aber voraussichtlich fröhlich auf einen Boolean, also $00 heruntercasten wird. Kann natürlich sein, daß Delphi hier mal wieder irgendwelche Compiler-Magic eingeführt hat (wundern tät es mich nicht). Früher war das jedenfalls in alten Delphiversionen nicht der Fall, weshalb die korrekte Variante irgendwas ala

Result := (0 <> GetVersionInfoEx(...)); wäre.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Falscher Product Type in OSVersionInfoEx

  Alt 11. Dez 2012, 07:38
Nur kurz, ich werde versuchen heute Abend Deine Fragen zu beantworten. Vorher schaffe ich es leider nicht.
Jens
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#8

AW: Falscher Product Type in OSVersionInfoEx

  Alt 11. Dez 2012, 10:39
Zitat:
Ich versuche mich auch bei dir nochmals an dem Hinweis: Boolean ist nicht BOOL (aka LongBool).
Ich hab's natürlich aufgrund deines Hinweises der Vollständigkeit halber VORHER noch mal ausprobiert. Weil man sich im Lauf der Jahre daran gewöhnt hat, dass ein BOOL mit einem Boolean "kompatibel" ist. "0000" ist ja auch das selbe wie "00" oder "0"...es wird einfach nicht mehr wie "true", egal wieviele Nullen man ran hängt

function GetOSVersionInfo(var OSInfo: TOSVersionInfoEx): boolean;
begin
FillChar(OSInfo,SizeOf(OSInfo),0);
// OSInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
Result := GetVersionEx(OSInfo);
end;

und schon ist der Result false. Es klappt also immer noch

Hab soeben noch den WindowsVersionString erweitert, weil man ja - wenn es beim Kunden klemmt - wissen muss, wo man bei neuen unbekannten Versionen nachbessern/erweitern muss:

Zitat:
function WindowsVersionString : string;
const
CrLf = #13#10;
var
OSInfo : TOSVersionInfoEx;
begin
if not GetOSVersionInfo(OSInfo)
then Result := GetWinVersionString(GetWinVersion(OSInfo))
else Result := rsUnknownWinVer+CrLf
+'MajorVersion: '+IntToStr(OSInfo.dwMajorVersion)+CrLf
+'MinorVersion: '+IntToStr(OSInfo.dwMinorVersion)+CrLf
+'ProductType: '+IntToStr(OSInfo.wProductType)+CrLf
+'BuildNumber: '+IntToStr(OSInfo.dwBuildNumber);
end;

Geändert von musicman56 (11. Dez 2012 um 10:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Falscher Product Type in OSVersionInfoEx

  Alt 11. Dez 2012, 11:37
Der Result wird durchaus false er wird aber niemals true sondern not false
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#10

AW: Falscher Product Type in OSVersionInfoEx

  Alt 11. Dez 2012, 16:25
Ich hab's natürlich aufgrund deines Hinweises der Vollständigkeit halber VORHER noch mal ausprobiert. Weil man sich im Lauf der Jahre daran gewöhnt hat, dass ein BOOL mit einem Boolean "kompatibel" ist. "0000" ist ja auch das selbe wie "00" oder "0"...es wird einfach nicht mehr wie "true", egal wieviele Nullen man ran hängt
Ist das so?

$100 ist als Byte in der Tat identisch mit $0, weil alles oberhalb von 8bit abgeschnitten wird beim Typecast. Als BOOL (also 32bit-Wert) hingegen nicht. Daß eine 32bittige 0 einer 8bittigen 0 entspricht ist mir auch klar. Das war aber hier nicht die Frage, bzw. das Problem. Ich bin ja hier nicht so modern ausgestattet. Aber Delphi 2009 habe ich auch. Also hab ich es mal getestet. Entwarnung. Delphi hat natürlich mal wieder den Weg des geringsten Widerstands gewählt und offenbar Compiler-Magic dafür engagiert damit Delphianer solche Dummheiten nicht machen. Was vermutlich dann bei allen die korrektes Verhalten erwarten - mal wieder - zu Überraschungen führt. Aber egal, bin ja kaum noch auf Delphi unterwegs. Habe es übrigens hiermit getestet:

Delphi-Quellcode:
program booltest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

function DeinApiAufruf(): LongBool;
begin
  Result := LongBool($100);
end;

function DeinDelphiWrapper(): Boolean;
begin
  Result := DeinApiAufruf();
end;

begin
  Write('Sagt: ');
  if DeinDelphiWrapper() then
    Writeln('True')
  else
    Writeln('False');
end.
Übrigens bist du auf das Lizenzproblem noch nichtmal eingegangen. Danke (oder wegen) Urheberrecht kann sich eben nicht mal jeder deinen Code krallen, es sei denn du machst ihn unter einer entsprechenden Lizenz verfügbar.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz