Delphi-PRAXiS
Seite 1 von 2  1 2      

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 02:51

OS Version ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich weiß, dass es davon genug Versionen gibt, also warum nicht noch eine? ;)

Könntet ihr es bitte mal testen? Ich habe es unter Windows 7 unter den verschiedenen Kompatibilitätsmodi ausprobiert. Klappt alles, bis auf Server 2008, da bekomme ich immer Vista raus.

Projekt im Anhang.

toms 30. Nov 2010 05:26

AW: OS Version ermitteln
 
Hallo Michael

1. Sehe ich es richtig: Wenn Architecture = AMD64 dann 64-bit, wenn Architecture = Intel dann 32-bit ?

Delphi-Quellcode:
GetSystemInfo(si);
  if (osvi.dwMajorVersion >= 6) then
  begin
    if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
      Result := Result + ' 64-bit'
    else if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL) then
      Result := Result + ' 32-bit';
  end;
end
2. LoadLibrary ... FreeLibrary (zudem lädst du zwei Mal den Kernel)

3. (Noch) nicht Unicode tauglich.

Aufruf von GetVersionEx gibt Fehler 'The data area passed to a system call is too small'.

RWarnecke 30. Nov 2010 06:28

AW: OS Version ermitteln
 
Hallo Michael,

auf einer Windows XP Professional SP3 Installation kommt als Ergebnis:

---------------------------
Project1
---------------------------
Windows XP Home Edition Service Pack 3 Build: 2600
---------------------------
OK
---------------------------

Ich habe mir zwar mal den Quelltext angeschaut, nur finde ich da ohne Delphi gerade den Fehler nicht. Für die Windows-API GetProductInfo gibt es noch mehr Ergbenisse. Die API arbeitet sehr zuverlässig, da ich diese bei mir im SystemInfo einsetze.

Edit:
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;
Dazu gibt es auch einen Beitrag hier im Forum, finde aber zu Zeit den Link nicht mehr.

Jens Hartmann 30. Nov 2010 07:50

AW: OS Version ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Michael,

leider Funktioniert es bei Windows 7 Professional 64-Bit auch nicht. Da kommt die Meldung 32-Bit.

Gruß Jens

Nersgatt 30. Nov 2010 08:03

AW: OS Version ermitteln
 
Windows 7 Prof 32 Bit: Passt
Windows XP home SP3: Passt nicht
---------------------------
Project1
---------------------------
Windows XP Professional Service Pack 3 Build: 2600
---------------------------
OK
---------------------------
(schön wärs :-D )

Neutral General 30. Nov 2010 09:10

AW: OS Version ermitteln
 
Hallo.

Prinzipiell stimmts bei mir:

---------------------------
Project1
---------------------------
Windows Vista rocessExefileBusiness Edition Service Pack 1 Build: 6001 32-bit
---------------------------
OK
---------------------------

Aber da hat sich glaube ich irgendwas dazwischen geschummelt, was da nicht hingehört :mrgreen:

divBy0 30. Nov 2010 09:13

AW: OS Version ermitteln
 
Mein Windows 7 Ultimate 64 wird als:

---------------------------
Project1
---------------------------
Windows 7 Ultimate Edition Build: 7600 32-bit
---------------------------
OK
---------------------------


erkannt.

mirage228 30. Nov 2010 09:31

AW: OS Version ermitteln
 
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 NICHT (Meldung als: Windows XP Home Edition Service Pack 3 Build: 2600)

Luckie 30. Nov 2010 10:23

AW: OS Version ermitteln
 
Im Quellcode habe ich ja die Quelle aus dem MSDN angegeben, wo ich den C Code übersetzt habe. Eventuell habe ich da einen Fehler gemacht.

C:
Code:
if Wert1 & Wert dann
Wurde bei mir zu
Delphi-Quellcode:
if Wert1 AND WERT2 = 0 dann
Das könnte eventuell nicht stimmen.

Und die 32/64-BIT Erkennung scheint nicht zu funktionieren.

Da ich nicht alle Versionen testen kann. Würde ich euch bitte doch mal den Code zu debuggen (sollte nicht sehr schwer sein, da es nur Verzweigungen sind) und zu gucken, wo er in den falschen Zweig springt und mir dass dann mitzuteilen.

Warum ich das noch mal mache ist, dass ich die vorgeschlagene Methode zur Bestimmung des Betriebssystems umsetzen wollte. Deswegen auch die 32/64-Bit Erkennung auf diese Weise.

Und Unicode ist es noch nicht, weil ich es hier auf dem Sofa hinter der Front auf dem Netbook mit meinem alten D7 entwickele. Kann man es so ändern, dass es sowohl unter D/ als Ansi compiliert, als auch unter D2010 als Unicode? Welche Datentypen müsste ich da nehmen. String sollte ja als Ansi und Unicode kompilieren.

Neutral General 30. Nov 2010 10:28

AW: OS Version ermitteln
 
Zitat:

Zitat von Luckie (Beitrag 1064989)
C:
Code:
if Wert1 & Wert dann
Wurde bei mir zu
Delphi-Quellcode:
if Wert1 AND WERT2 = 0 dann
Das könnte eventuell nicht stimmen.

Das stimmt tatsächlich nicht.
Code:
if (Wert1 & Wert2)
müsste

Delphi-Quellcode:
if (Wert1 and Wert2) <> 0 then


sein. Oder auch

Delphi-Quellcode:
if Boolean(Wert1 and Wert2) then

Der Jan 30. Nov 2010 10:31

AW: OS Version ermitteln
 
Nicht OK:
Windows XP Professional SP3 32-bit --> angezeigt als: Windows XP Home Edition Service Pack 3 Build: 2600
Windows Server 2003 Standard Edition SP2 --> angezeigt als: Storage Server 2003 Compute Cluster Edition Service Pack2, Build: 3790

OK:
Windows Vista (Wine unter Debian Lenny, Vista Mode) --> Angezeigt als: Windows Vista Service Pack 2, Build 6002 32-bit
Windows 2000 (Wine unter Debian Lenny, Win2k Mode) --> Angezeigt als: Windows 2000 Profesional Service Pack 4, Build: 2195

Luckie 30. Nov 2010 10:35

AW: OS Version ermitteln
 
Wie gesagt, das hilft mir im Moment nicht all zu viel. Deswegen habe ich euch ja gebeten mal im Quellcode zu gucken, wo es schief läuft.

v2afrank 30. Nov 2010 11:04

AW: OS Version ermitteln
 
Mein 64 Bit Win 7 wird auch als 32 Bit erkannt. Ich bin das ganze mal im Debugger durchgegangen.
Der Fehler passiert hier
Delphi-Quellcode:
  if (osvi.dwMajorVersion >= 6) then
  begin
    if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
      Result := Result + ' 64-bit'
    else if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL) then
      Result := Result + ' 32-bit';
  end;
si.wProcessorArchitecture ist bei mir 0, was PROCESSOR_ARCHITECTURE_INTEL entspricht. Ich habe allerdings auch eine Intel CPU

Luckie 30. Nov 2010 12:15

AW: OS Version ermitteln
 
Hm, da muss ich mal gucken, ob ich da was falsch abgeschrieben habe.

Luckie 30. Nov 2010 12:23

AW: OS Version ermitteln
 
Noch mal zu dem C Code:
Code:
if Wert1 & Wert dann
Wie übersetzt man das in Delphi? Eventuell habe ich das falsch Übersetzt.

p80286 30. Nov 2010 12:26

AW: OS Version ermitteln
 
ich denke so ists dann richtig:
Delphi-Quellcode:
if (osvi.wSuiteMask and VER_SUITE_PERSONAL = VER_SUITE_PERSONAL) then
Home ist $0200 und Prof ist $0100

Gruß
K-H

Luckie 30. Nov 2010 12:33

AW: OS Version ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
OK. Korrigiert. Bitte noch mal testen. Eventuell behebt das schon einige Fehler.

Jens Hartmann 30. Nov 2010 12:38

AW: OS Version ermitteln
 
Hallo Michael,

Windows 7 Professional 64-Bit geht immer noch nicht. Da kommt immer noch die Meldung 32-Bit.

Gruß Jens

Bummi 30. Nov 2010 12:38

AW: OS Version ermitteln
 
Server 2008R2 Enterprise

[Window Title]
Project2

[Content]
Der an einen Systemaufruf übergebene Datenbereich ist zu klein

[OK]

DeddyH 30. Nov 2010 12:40

AW: OS Version ermitteln
 
Zitat:

---------------------------
Project1
---------------------------
Windows Vista rocessExefileBusiness Edition Service Pack 2 Build: 6002 32-bit
---------------------------
OK
---------------------------
Stimmt hier (von dem blödsinnigen String mal abgesehen).

Nersgatt 30. Nov 2010 12:44

AW: OS Version ermitteln
 
Windows 7 32 Bit Prof: Passt
Windows XP Home SP3: Passt

Bummi 30. Nov 2010 12:46

AW: OS Version ermitteln
 
Code:
  TOSVersionInfoEx = packed record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    [COLOR="SandyBrown"]szCSDVersion: array[0..127] of WideChar;[/COLOR]
    wServicePackMajor: Word;
    wServicePackMinor: Word;
    wSuiteMask: Word;
    wProductType: Byte;
    wReserved: Byte;
  end;
so läuft es bei mir

Luckie 30. Nov 2010 12:57

AW: OS Version ermitteln
 
@Nersgatt: Dann sind die Fehler bei dir jetzt weg?

@Bummi: Das WideChar reicht aus, um es Unicode fähig zu machen?

Bummi 30. Nov 2010 13:02

AW: OS Version ermitteln
 
Ich weiß nicht was auf einem Chinesischen System passiert unter Delphi XE und o.g. System läuft es so.

Luckie 30. Nov 2010 13:07

AW: OS Version ermitteln
 
Schön, dann sind ja keine großen Änderungen erforderlich.

Bummi 30. Nov 2010 13:33

AW: OS Version ermitteln
 
Sorry ich war zu schnell

[Window Title]
Project2

[Content]
Windows Server 2008 R2 Enterprise Edition Build: 7600 32-bit

[OK]

ist aber definitiv 64 -Bit

Nersgatt 30. Nov 2010 13:34

AW: OS Version ermitteln
 
Zitat:

Zitat von Luckie (Beitrag 1065037)
@Nersgatt: Dann sind die Fehler bei dir jetzt weg?

Ja. :thumb:

Luckie 30. Nov 2010 13:36

AW: OS Version ermitteln
 
OK, aber warum bekomme ich unter Sever 2008 Vista angezeigt, wenn ich es unter Windows 7 im Kompatibilitätsmodus starte?

Luckie 30. Nov 2010 13:38

AW: OS Version ermitteln
 
Zitat:

Zitat von Bummi (Beitrag 1065056)
ist aber definitiv 64 -Bit

Wenn du zeit hast, könntest du das mal bitte debuggen?

Bummi 30. Nov 2010 13:49

AW: OS Version ermitteln
 
die Stelle ist klar
Delphi-Quellcode:
  if (osvi.dwMajorVersion >= 6) then
  begin
    if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
      Result := Result + ' 64-bit'
    else if (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL) then
      Result := Result + ' 32-bit';
  end;
hier wird si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL = 0 geliefert

ist die Frage ob da auch so ein SYSWOW64 zuschlägt.


EDIT:

Nein Wow64DisableWow64FsRedirection bringt nichts

Bummi 30. Nov 2010 13:58

AW: OS Version ermitteln
 
"hathor" hat unter

http://www.delphi-forum.de/topic_Wie...m_99738,0.html etwas gepostet was funktioniert, letzter Post.

EDIT:

Damit könnte das Ende Deiner Prozedur IMHO so aussehen:
Delphi-Quellcode:
  Result := Result + ' Build: ' + IntToStr(osvi.dwBuildNumber);

  if IsWindows64 then Result := Result + ' 64-bit'  else Result := Result + ' 32-bit';

Luckie 30. Nov 2010 14:15

AW: OS Version ermitteln
 
Also das ist die Quelle http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

Und das ist die Stelle:
Code:
if ( osvi.dwMajorVersion >= 6 )
      {
         if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
            StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));
         else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
            StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));
      }
aus dem original Code. Habe ich da was falsch übersetzt oder stimmt der original Code schon nicht?

Bummi 30. Nov 2010 14:19

AW: OS Version ermitteln
 
Hast Du Dir den Link auf Hathors Lösung angeschaut
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;

Luckie 30. Nov 2010 14:21

AW: OS Version ermitteln
 
In wie fern sollte das mein Problem lösen?

Bummi 30. Nov 2010 14:23

AW: OS Version ermitteln
 
vielleicht hab ich ja etwas missverstanden aber mit o.g. Funktion werden bei mir die 64-Bit richtig erkannt.

Luckie 30. Nov 2010 14:28

AW: OS Version ermitteln
 
Das müsste dieser Stelle im original Code entsprechen:
Code:
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

   pGNSI = (PGNSI) GetProcAddress(
      GetModuleHandle(TEXT("kernel32.dll")),
      "GetNativeSystemInfo");
   if(NULL != pGNSI)
      pGNSI(&si);
   else GetSystemInfo(&si);
Da war ich etwas unsicher, wie ich das übersetzen sollte und habe es weggelassen. Muss ich das wohl noch implementieren.

Luckie 30. Nov 2010 14:32

AW: OS Version ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
OK, Habe die Funktion übernommen. Bitte noch mal testen. Sollte jetzt auch Unicode fähig sein.

Neutral General 30. Nov 2010 14:35

AW: OS Version ermitteln
 
Hallo,

Hast (leider) immernoch den (kleinen) Fehler drin:

Delphi-Quellcode:
case ProductType of
  //..
  PRODUCT_BUSINESS:
       Result := Result + ' rocessExefileBusiness Edition';
(Wobei der natürlich im Vergleich zu den anderen Problemen eher keine so hohe Priorität hat^^)

Bummi 30. Nov 2010 14:36

AW: OS Version ermitteln
 
Nur weil Du's bist, eine EXE mach ich sonnst nicht auf. :thumb: Passt.

Jens Hartmann 30. Nov 2010 14:37

AW: OS Version ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt geht´s

Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.
Seite 1 von 2  1 2      

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