Entwickler-Ecke

Windows API - Windows Version ermitteln inkl. Windows 7 x86 & x64


kandesbunzler - Do 19.04.12 17:41
Titel: Windows Version ermitteln inkl. Windows 7 x86 & x64
Hallo,

wie kann ich die Windowsversion bis einschließlich Windows 7 sowie deren 'Bitbreiten' ermitteln.

Ich habe hierzu bereits etliche Ansätze in verschiedenen Foren durchgelesen, (bspw.
http://www.swissdelphicenter.ch/de/showcode.php?id=316
http://www.swissdelphicenter.ch/de/showcode.php?id=1126
http://www.delphipraxis.net/97999-%5Bkompo%5D-twindowsversionsinfo-kompo-zur-windowserkennung.html
http://www.delphi-forum.de/viewtopic.php?t=66341&highlight=windows+version+ermitteln
http://www.delphi-treff.de/tipps/system/systemeigenschaften/windows-version-ermitteln/).

Leider sind etliche Beiträge schon älteren Datums oder ich bekomme es einfach nicht zum Laufen.

Über eine Lösung oder Beispielprojekt würde ich mich freuen.

Danke und Gruß,
kandesbunzler.


bummi - Do 19.04.12 18:14

vielleicht hilft der Anhang


kandesbunzler - Do 19.04.12 22:40

Danke bummi.

Ich versuche gerade, die Unit uGetWindowsVersion einzubinden, erhalte aber beim Compilieren die Fehlermeldung: "The data area passed to a system call is too small". Der Debugger bleibt in Zeile 143 stehen (raise Exception.Create(SysErrorMessage(getLastError)).

Was könnte hier fehlschlagen?

Gruß,
kandesbunzler.

PS: Ergänzungen/Alternativen sind willkommen!


Delete - Fr 20.04.12 00:33

szCSDVersion: array[0..127] of WideChar;

ändern in

szCSDVersion: array[0..127] of AnsiChar;


kandesbunzler - Fr 20.04.12 06:44

Guten Morgen,

es hat prima geklappt, danke an Euch.

Gruß
kandesbunzler.


Delphi-Laie - Fr 20.04.12 15:00

Es funktioniert im Sinne einer sinnvollen Ausgabe durchaus.

Allerdings stört / stößt sich Delphi beim Compilieren doch noch an etwas: "[Warnung] uGetWindowsVersion.pas(253): Variable 'GetProductInfo' wurde wahrscheinlich nicht Initialisiert".


Delete - Fr 20.04.12 19:10

//GetProductInfo
statt: @GetProductInfo := GetProcAddress(LibraryHandle, 'GetProductInfo');


Delphi-Quelltext
1:
2:
3:
4:
initialization
   @GetProductInfo := GetProcAddress(LibraryHandle('KERNEL32.DLL'),'GetProductInfo');

End.


Delphi-Laie - Sa 21.04.12 11:51

Die meinerseits monierte Warnung lag (nur) daran, daß in besagter Unit um die Zeile 250:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
LibraryHandle := LoadLibrary('kernel32.dll');
if LibraryHandle <> 0 then
begin
  @GetProductInfo := GetProcAddress(LibraryHandle, 'GetProductInfo');
  if Assigned(GetProductInfo) then
  begin
    GetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, 00, ProductType);
  end;
end;

GetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, 00, ProductType);


GetProductInfo irrtümlich noch einmal aufgerufen wurde.