![]() |
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. |
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:
2. LoadLibrary ... FreeLibrary (zudem lädst du zwei Mal den Kernel)
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 3. (Noch) nicht Unicode tauglich. Aufruf von GetVersionEx gibt Fehler 'The data area passed to a system call is too small'. |
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:
Dazu gibt es auch einen Beitrag hier im Forum, finde aber zu Zeit den Link nicht mehr.
////////////////////////////////////////////////////////////////////////////////
// // 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; |
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 |
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 ) |
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: |
AW: OS Version ermitteln
Mein Windows 7 Ultimate 64 wird als:
--------------------------- Project1 --------------------------- Windows 7 Ultimate Edition Build: 7600 32-bit --------------------------- OK --------------------------- erkannt. |
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) |
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:
Wurde bei mir zu
if Wert1 & Wert dann
Delphi-Quellcode:
Das könnte eventuell nicht stimmen.
if Wert1 AND WERT2 = 0 dann
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. |
AW: OS Version ermitteln
Zitat:
Code:
müsste
if (Wert1 & Wert2)
Delphi-Quellcode:
if (Wert1 and Wert2) <> 0 then
sein. Oder auch
Delphi-Quellcode:
if Boolean(Wert1 and Wert2) then
|
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 |
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.
|
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:
si.wProcessorArchitecture ist bei mir 0, was PROCESSOR_ARCHITECTURE_INTEL entspricht. Ich habe allerdings auch eine Intel CPU
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; |
AW: OS Version ermitteln
Hm, da muss ich mal gucken, ob ich da was falsch abgeschrieben habe.
|
AW: OS Version ermitteln
Noch mal zu dem C Code:
Code:
Wie übersetzt man das in Delphi? Eventuell habe ich das falsch Übersetzt.
if Wert1 & Wert dann
|
AW: OS Version ermitteln
ich denke so ists dann richtig:
Delphi-Quellcode:
Home ist $0200 und Prof ist $0100
if (osvi.wSuiteMask and VER_SUITE_PERSONAL = VER_SUITE_PERSONAL) then
Gruß K-H |
AW: OS Version ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
OK. Korrigiert. Bitte noch mal testen. Eventuell behebt das schon einige Fehler.
|
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 |
AW: OS Version ermitteln
Server 2008R2 Enterprise
[Window Title] Project2 [Content] Der an einen Systemaufruf übergebene Datenbereich ist zu klein [OK] |
AW: OS Version ermitteln
Zitat:
|
AW: OS Version ermitteln
Windows 7 32 Bit Prof: Passt
Windows XP Home SP3: Passt |
AW: OS Version ermitteln
Code:
so läuft es bei mir
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; |
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? |
AW: OS Version ermitteln
Ich weiß nicht was auf einem Chinesischen System passiert unter Delphi XE und o.g. System läuft es so.
|
AW: OS Version ermitteln
Schön, dann sind ja keine großen Änderungen erforderlich.
|
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 |
AW: OS Version ermitteln
Zitat:
|
AW: OS Version ermitteln
OK, aber warum bekomme ich unter Sever 2008 Vista angezeigt, wenn ich es unter Windows 7 im Kompatibilitätsmodus starte?
|
AW: OS Version ermitteln
Zitat:
|
AW: OS Version ermitteln
die Stelle ist klar
Delphi-Quellcode:
hier wird si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL = 0 geliefert
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; ist die Frage ob da auch so ein SYSWOW64 zuschlägt. EDIT: Nein Wow64DisableWow64FsRedirection bringt nichts |
AW: OS Version ermitteln
"hathor" hat unter
![]() 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'; |
AW: OS Version ermitteln
Also das ist die Quelle
![]() Und das ist die Stelle:
Code:
aus dem original Code. Habe ich da was falsch übersetzt oder stimmt der original Code schon nicht?
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")); } |
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; |
AW: OS Version ermitteln
In wie fern sollte das mein Problem lösen?
|
AW: OS Version ermitteln
vielleicht hab ich ja etwas missverstanden aber mit o.g. Funktion werden bei mir die 64-Bit richtig erkannt.
|
AW: OS Version ermitteln
Das müsste dieser Stelle im original Code entsprechen:
Code:
Da war ich etwas unsicher, wie ich das übersetzen sollte und habe es weggelassen. Muss ich das wohl noch implementieren.
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
pGNSI = (PGNSI) GetProcAddress( GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); if(NULL != pGNSI) pGNSI(&si); else GetSystemInfo(&si); |
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.
|
AW: OS Version ermitteln
Hallo,
Hast (leider) immernoch den (kleinen) Fehler drin:
Delphi-Quellcode:
(Wobei der natürlich im Vergleich zu den anderen Problemen eher keine so hohe Priorität hat^^)
case ProductType of
//.. PRODUCT_BUSINESS: Result := Result + ' rocessExefileBusiness Edition'; |
AW: OS Version ermitteln
Nur weil Du's bist, eine EXE mach ich sonnst nicht auf. :thumb: Passt.
|
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. |
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