Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   OS Version ermitteln (https://www.delphipraxis.net/156372-os-version-ermitteln.html)

Luckie 30. Nov 2010 14:38

AW: OS Version ermitteln
 
Habe ich die dpr im Archiv vergessen? Nö, die liegt doch bei.

Gut, dann bleibt noch der Fehler warum der Server 2008 als Vista erkannt wird.

Bummi 30. Nov 2010 14:45

AW: OS Version ermitteln
 
Vielleicht wg. Serviepack2

http://capitalhead.com/articles/how-...installed.aspx

himitsu 30. Nov 2010 14:48

AW: OS Version ermitteln
 
Zitat:

Zitat von Luckie (Beitrag 1065018)
Noch mal zu dem C Code:
Code:
if Wert1 & Wert dann
Wie übersetzt man das in Delphi? Eventuell habe ich das falsch Übersetzt.

Alles was am Ende übrig bleibt, das bewertet C als Boolean.

False = 0
True <> 0

also
Delphi-Quellcode:
if TheVar and TheConstOderSonstwas <> 0 then
.


Zitat:

Zitat von p80286 (Beitrag 1065020)
Delphi-Quellcode:
if (osvi.wSuiteMask and VER_SUITE_PERSONAL = VER_SUITE_PERSONAL) then

das ist ja fast genauso gut, wie
Delphi-Quellcode:
if TheBool = true then
, außerdem ist es länger und, wie ich finde, unübersichtlicher, als
Delphi-Quellcode:
if osvi.wSuiteMask and VER_SUITE_PERSONAL <> 0 then
Dieses Konstengenvergleiche ist nur wichtig, wenn es um Vergleiche mehrer Bits geht.

also z.B.
Delphi-Quellcode:
const Value0 = $00;
  Value1 = $01;
  Value2 = $02;
  Value3 = $03;
  ValueMask = $0F;
if TheVar and ValueMask = Value2 then

p80286 30. Nov 2010 17:08

AW: OS Version ermitteln
 
Einspruch Euer Ehren,
Damit wollte ich zum Ausdruck bringen, das dieses Bit gesetzt sein muß (wobei man im ersten Moment natürlich nicht weiß, daß sich hinter VER_SUITE_PERSONAL nur ein Bit versteckt)
Und wenn man von der Länge des Konstantennamens absieht halte ich das für sauberer als das beliebige <>0, weil das Bitmuster das gleiche sein muß!

Gruß
K-H

Bummi 30. Nov 2010 17:33

AW: OS Version ermitteln
 
@Luckie

nimm das

GetNativeSystemInfo(si);

an den Anfang hoch sonst wird XP64 Bit als Server2003 deklariert.

Luckie 30. Nov 2010 18:28

AW: OS Version ermitteln
 
OK, aber das habe ich eigentlich hier berücksichtigt:
Delphi-Quellcode:
if (osvi.dwMajorVersion = 6) then
    begin
      if (osvi.dwMinorVersion = 0) then
      begin
        if (osvi.wProductType = VER_NT_WORKSTATION) then
          Result := 'Windows Vista'
        else
          Result := 'Windows Server 2008';
      end;
Wie im Original auch.

Bummi 30. Nov 2010 18:33

AW: OS Version ermitteln
 
Du greifst vorher mehrfach auf

Delphi-Quellcode:
si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64
zu.


EDIT

zumindest in der Letzten Version war si gar nicht mehr initialisiert bis zum GetNativeSystemInfo

toms 30. Nov 2010 18:37

AW: OS Version ermitteln
 
Funktion aus dem DF:

Delphi-Quellcode:
function GetNativeSystemInfo(var SystemInfo: TSystemInfo): Boolean;
type
  TGetNativeSystemInfo = procedure (var SystemInfo: TSystemInfo) stdcall;
var
  LibraryHandle: HMODULE;
  _GetNativeSystemInfo: TGetNativeSystemInfo;
begin
  Result := False;
  LibraryHandle := GetModuleHandle(kernel32);

  if LibraryHandle <> 0 then
  begin
    _GetNativeSystemInfo := GetProcAddress(LibraryHandle,'GetNativeSystemInfo');
    if Assigned(_GetNativeSystemInfo) then
    begin
      _GetNativeSystemInfo(SystemInfo);
      Result := True;
    end
    else
      GetSystemInfo(SystemInfo);
  end
  else
    GetSystemInfo(SystemInfo);
end;

function IsWindows64: Boolean;
var
  ASystemInfo: TSystemInfo;
const
  PROCESSOR_ARCHITECTURE_INTEL = 0;
  PROCESSOR_ARCHITECTURE_IA64 = 6;
  PROCESSOR_ARCHITECTURE_AMD64 = 9;
begin
  GetNativeSystemInfo(ASystemInfo);
  Result := ASystemInfo.wProcessorArchitecture in [PROCESSOR_ARCHITECTURE_IA64,PROCESSOR_ARCHITECTURE_AMD64];
end;

Luckie 30. Nov 2010 18:41

AW: OS Version ermitteln
 
Zitat:

Zitat von Bummi (Beitrag 1065183)
zumindest in der Letzten Version war si gar nicht mehr initialisiert bis zum GetNativeSystemInfo

Das ist jetzt behoben und steht am Anfang.

@toms: Das mit dem 32/64-Bit scheint jetzt gelöst zu sein. Ich habe nur noch das Vista/Srever 2008 Problem.

Luckie 30. Nov 2010 22:11

AW: OS Version ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier ist die aktuelle Version.

mirage228 1. Dez 2010 07:19

AW: OS Version ermitteln
 
Der Vollständigkeit halber hier nochmal:
Windows 7 Professional 32-bit: Passt (Meldung als: Windows 7 Professional Build: 7600 32-bit)
Windows XP Professional SP3 32-bit (VM, "Windows XP-Mode"): Passt (Meldung als: Windows XP Professional Service Pack 3 Build: 2600)

Luckie 1. Dez 2010 08:22

AW: OS Version ermitteln
 
Sehr schön. Danke fürs Testen. Hätte jemand noch den Server 2008 zum Testen zur Verfügung? Weil damit habe ich im Kompatibilitätsmodus ja dieses Vista Problem. Eventuell ist es ja nur ein Problem mit dem Kompatibilitätsmodus und es funktioniert in Wirklichkeit.

user0815 1. Dez 2010 09:05

AW: OS Version ermitteln
 
Zitat:

Hätte jemand noch den Server 2008 zum Testen zur Verfügung?
Lad ihn doch runter: http://technet.microsoft.com/de-de/e.../cc137123.aspx
:)

Luckie 1. Dez 2010 09:10

AW: OS Version ermitteln
 
Würde ich machen, aber ich habe zur Zeit nur ein kleines Netbook zur Verfügung, welches ich mir mit meinem Vater teile. Und eine VM würde es wohl in die Knie zwingen.

Delphi-Laie 31. Dez 2010 13:57

AW: OS Version ermitteln
 
Zitat:

Zitat von RWarnecke (Beitrag 1064945)
Um zu überprüfen, ob das OS 32Bit oder 64Bit ist, würde ich diese Funktion nehmen :
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
//
//  Bestimmen ob das Betriebssystem 64Bit ist oder nicht
//
function IsWow64: Boolean;
type
  TIsWow64Process = function(Handle: Windows.THandle; var Res: Windows.BOOL): Windows.BOOL; stdcall;
var
  IsWow64Result: Windows.BOOL;     // Result from IsWow64Process
  IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
begin
  // Try to load required function from kernel32
  IsWow64Process := Windows.GetProcAddress(Windows.GetModuleHandle('kernel32'), 'IsWow64Process');
  if Assigned(IsWow64Process) then
  begin
    // Function is implemented: call it
    if not IsWow64Process(Windows.GetCurrentProcess, IsWow64Result) then
      raise SysUtils.Exception.Create('IsWow64: bad process handle');
    // Return result of function
    Result := IsWow64Result;
  end
  else
    // Function not implemented: can't be running on Wow64
    Result := False;
end;

Das scheint nur mit 32-Bit-Programmen zu funktionieren, was auch logisch ist, weil 64-Bit-Programme nicht unter "wow64" laufen. Also ist diese Funktion als universeller Quelltext für 32- und 64-Bit-Compilate (Lazarus!) untauglich. Mit den Compilerschaltern {$IFDEF CPU32},{$IFDEF CPU64}, {$IFDEF WIN32} und/oder {$IFDEF WIN64} ist aber eine zufriedenstellende Anpassung und Ergänzung dieser Funktion möglich, so daß bei 64-Bit-Compilaten (die auf Win32-System ohnehin nicht laufen) automatisch der Wert true zurückgegeben wird.

Zu ergänzen wäre noch, daß

- unter Windows 32 Bit 64-Bit-Prozessoren von Lazarus nicht als solche (also mit 64 Bit) erkannt werden (das ist naheliegend)
- Lazarus 32 Bit unter Windows 64 Bit auch nur 32 Bit sowohl beim Prozessor als auch beim Betriebsprogramm erkennt (was m.E. ebenso naheliegend ist),

so daß mir nicht klar ist, wann {$IFDEF CPU32}<>{$IFDEF CPU64} und/oder {$IFDEF WIN32}<>{$IFDEF WIN64} jemals eintreffen sollte (CPU64 kann nur unter WIN64 festgestellt werden, umgekehrt gilt das erst recht).

Also, die obige Prozedur z.B. mit einem der beiden 32-Bit-Compilerschalter "eingekreist" (oder eingeleitet) und einem Else-Schalter (alternativ: Einer der beiden 64-Bit-Compilerschalter), der die Funkttion bei 64 Bit mit einem einfachen true zurückliefert, müßte das diese Funktion auch Bitanzahl-Plattform-übergreifend komplettieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz