![]() |
Win & Dos Versions Nummern abfragen.
Hallo, ich bastel gerade an einer About-Box und wollte als mini-Gimmick eine Oldstyle Windows und Dos Versions Angabe integrieren, also nichts Aufregendes wo einem zig Sachen über's OS erzählt wird sondern lediglich 2 Werte, wahrscheinlich in einem LED Look aber das tut hier nichts zur Sache.
Meine Frage relativ simpel, bisher habe ich habe immer
Code:
diesen Code benutzt, sollte ich meinen Code updaten für Delphi (Tokyo) oder ist das alles noch konform?
Var WinVersion, DosVersion: Word;
WinStr, DosStr: String; //... WinVersion := Windows.GetVersion and $0000FFFF; WinStr := IntToStr(Lo(WinVersion))+'.'+IntToStr(Hi(WinVersion)); DosVersion := Windows.GetVersion shr 16; DosStr := IntToStr(Hi(DosVersion))+'.'+IntToStr(Lo(DosVersion)); |
AW: Win & Dos Versions Nummern abfragen.
An Delphi wird es nicht scheitern. Lediglich an Deiner wiederholenden Weigerung, mal einen Blick in die Doku zu werfen.
![]() Eine „DOS“-Version ergibt schon fachlich keinen Sinn mehr. Und selbst die Versionsnummer von Windows lässt seit Version 8.1 überraschend viel Spielraum für Interpretationen. Dieser Weg ist für eine belastbare Aussage nicht mehr tauglich. |
AW: Win & Dos Versions Nummern abfragen.
Hallo,
für Windows fragt man am besten die Version der Datei kernel32.dll ab |
AW: Win & Dos Versions Nummern abfragen.
DOS-Version - Gibts seit Windows95 nicht mehr.
|
AW: Win & Dos Versions Nummern abfragen.
Nein ist schon lange nicht mehr konform, hat aber nichts mit Delphi sondern mit der Windows API ab Win8 zu tun. siehe hier
![]() https://msdn.microsoft.com/de-de/library/windows/desktop/ms724834 nutze OSVersionInfo oder OSVersionInfoEx Gruß Matthias |
AW: Win & Dos Versions Nummern abfragen.
OSVERSIONINFO, daß ist es was ich nun anwenden werde, scheint mir am besten dafür geeignet zu sein.
Vielen Dank! Ps: An Daniel, was lässt Dich vermuten das ich Hilfe ablehne wenn ich doch der Fragestellende bin? Hätte ich mich verweigert Informationen zu lesen wäre ich damals ja nicht auf den GetVersion Befehl und dessen Verarbeitung gestoßen, das es Windows ab 8 oder 8.1 nun anders handhabt ist mir neu, falls Deine Aussage eine Anspielung sein soll das ich mich mal informieren sollte bevor ich hier eine Frage stelle, Ok Sir, wird nun so gemacht Sir. PPs: Die Dos-Version sollte halt eine Unterhaltsame Einblendung an alte Tage sein, ob fachlich korrekt oder nicht. PPPs: Zur Aussage ab Win95 kein DOS -> ![]() |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
|
AW: Win & Dos Versions Nummern abfragen.
Zitat:
Aber alles unter XP kann man wohl als "Antike OS-Versionen" betrachten und XP als "OldTimer" |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
Zumindest kann er jemanden anhand der IP identifizieren und somit weis er wer oder was du hier früher einmal warst. Da du nun auf der Basis weitermachst frage ich mich warum du dich überhaupt abgemeldet hast. Dir hat niemand etwas getan das diese Entscheidung verständlich macht. Sorry OT aber es hat mich gereizt darauf zu antworten. gruss |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
Im Jahr 2018 das Betriebssystem Windows nach einer DOS-Versionsnummer fragen zu wollen, zeugt von einer hinreichenden Unkenntnis der API-Dokumentation. Man kann nicht alle APIs im Kopf haben, muss man auch nicht, aber bevor ich mich hinsetze und in einem Forum einen Beitrag schreibe, gucke ich doch mal kurz, was der Hersteller zur API-Funktion schreibt. Und auch wenn man viel auf Microsoft schimpft - das MSDN ist seit vielen, vielen Jahren eine hochwertige Informationsquelle. |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
Nicht jeder Typ oder jede Konstante ist haargenau im MSDN inkl. Wert / kompletter Definition genannt, aber im SDK ist alles drin. |
AW: Win & Dos Versions Nummern abfragen.
Ja Danke nochmals dafür, ich habe wirklich nicht im Vorfeld nochmal kontrolliert ob es, seitdem ich den Code nutze, Neuerrungen dazu gemacht wurden. Unter Windows 7 funktionierte es, Windows 10 zeigt verschiedenes an. Das es an Windows selbst lag hätte ich nicht für möglich gehalten, ich dachte es sei der Umstieg auf Tokyo.
|
AW: Win & Dos Versions Nummern abfragen.
Zitat:
![]() Beim Zugriff auf kernel32.dll gibt mir die funktion False zurück, GetLastError deutet auf "Datei nicht gefunden" hin, ich übergebe den kompletten Pfad. Irgendwas mache ich dabei falsch. So hier in etwa verarbeite ich es: (Code nicht von mir)
Delphi-Quellcode:
In einem Demo Projekt mit gleichem Code nur auf eine Datei im selben Verzeichniss angewendet klappt alles,
function GetVersionInfo(NameApp, VerOpt: String): String;
var dump: DWORD; size: integer; buffer: PChar; VersionPointer, TransBuffer: PChar; Temp: integer; CalcLangCharSet: string; begin size := GetFileVersionInfoSize(PChar(NameApp), dump); buffer := StrAlloc(size+1); try GetFileVersionInfo(PChar(NameApp), 0, size, buffer); VerQueryValue(buffer, 'VarFileInfo\Translation', pointer(TransBuffer), dump); if dump >= 4 then begin temp:=0; StrLCopy(@temp, TransBuffer, 2); CalcLangCharSet := IntToHex(temp, 4); StrLCopy(@temp, TransBuffer+2, 2); CalcLangCharSet := CalcLangCharSet+IntToHex(temp, 4); end; VerQueryValue(buffer, pchar('StringFileInfo\' + CalcLangCharSet + '\' + VerOpt), pointer(VersionPointer), dump); if (dump > 1) then begin SetLength(Result, dump); StrLCopy(Pchar(Result), VersionPointer, dump); end else Result := ''; finally StrDispose(Buffer); end; end; wenn ich nun die .exe zur kernel32.dll hinkopiere bleibt der Fehler bestehen. |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
Das geht so:
Delphi-Quellcode:
type
TRTLOSVersioninfoExW = record dwOSVersionInfoSize: DWORD; dwMajorVersion: DWORD; dwMinorVersion: DWORD; dwBuildNumber: DWORD; dwPlatformId: DWORD; szCSDVersion: array[0..127] of WIDECHAR; wServicePackMajor: WORD; wServicePackMinor: WORD; wSuiteMask: WORD; wProductType: BYTE; wReserved: BYTE; end; function RTLGetVersion(out RtlOsVer: TRTLOSVersioninfoExW): boolean; var po : TFarProc; hKernelLib: THandle; GetRTLVEX : function(var vex: TRTLOSVersioninfoExW): DWORD; stdcall; begin result := false; ZeroMemory(@RtlOsVer, sizeof(RtlOsVer)); RtlOsVer.dwOSVersionInfoSize := sizeof(TRTLOSVersioninfoExW); hKernelLib := LoadLibrary('ntdll'); if hKernelLib > 0 then try po := GetProcAddress(hKernelLib, 'RtlGetVersion'); if po <> nil then begin @GetRTLVEX := po; GetRTLVEX(RtlOsVer); result := true; end; finally FreeLibrary(hKernelLib); end end; |
AW: Win & Dos Versions Nummern abfragen.
Vielen Dank! Klappt auf Anhieb Perfekt!
Ich weiß nun auch woran es lag das GetVersionInfo seinen Dienst verweigerte, mein Programm benötigt Admin-Rechte die es nicht hat. :wall: |
AW: Win & Dos Versions Nummern abfragen.
|
AW: Win & Dos Versions Nummern abfragen.
Wenn Windows 10 für das Programm den Kompatibilitätsmodus für XP aktiviert, dann liefert TOSVersion doch bestimmt XP als Version?
Aber ich verstehe nicht wieso das nun falsch sein soll, wenn die APIs/Rechte, welche das Programm nutzt, auch auf XP-Niveau eingestellt sind. :stupid: |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
|
AW: Win & Dos Versions Nummern abfragen.
Danke auch dafür, aber eine komplette Klasse zu nutzen nur um ein "10.0" zu bekommen ist zu viel des guten, oder?
Ich bin dem Beispiel von Frickler gefolgt, habe es für mich etwas abgespeckt, und es sieht nun so aus:
Code:
Klein, schnell und funktionell.
//...
type _OSVERSIONINFOW = record dwOSVersionInfoSize: ULONG; dwMajorVersion: ULONG; dwMinorVersion: ULONG; dwBuildNumber: ULONG; dwPlatformId: ULONG; szCSDVersion: array [0..127] of WCHAR; end; OSVERSIONINFOW = _OSVERSIONINFOW; PRTL_OSVERSIONINFOW = ^OSVERSIONINFOW; //... function RtlGetVersion(lpVersionInformation: PRTL_OSVERSIONINFOW): NTSTATUS; StdCall; //... function RtlGetVersion; External NTDLL Name 'RtlGetVersion'; |
AW: Win & Dos Versions Nummern abfragen.
Ich meine, dass wenn du keine Manifest-Datei verwendest, dein Programm sowieso nur im Kompatibilitätsmodus läuft.
|
AW: Win & Dos Versions Nummern abfragen.
Also mein Programm besitzt ein Manifest, aber nur für Theme aktivierung nicht um sich Rechte/Kompatibilitätsmodus anzufordern.
Ich weiß auch nicht wie ich per Code Abfragen kann in welchen Modus mein Programm gestartet wurde (Kompatibilitätsmodus, wenn ja, welcher?). Darüber muss ich mich erst Informieren. |
AW: Win & Dos Versions Nummern abfragen.
Zitat:
|
AW: Win & Dos Versions Nummern abfragen.
Es hat dein Programm eigentlich auch garnicht zu interessieren ob und in welchem Kompatibilitätsmodus es läuft.
Schon ganrnicht, um davon abhängig irgendwas Anders zu machen. Stattdessen sollte man sein Programm für die bekannten Versionen kompatibel machen und sagt dann Windows welche Versionen es sind. Genau das gehört dann ins Manifest. Und standardmäßig bekommt man in diesen Versionen dann auch die richtige Versionsnummer angezeigt, sogar mit der regulären Versions-API. |
AW: Win & Dos Versions Nummern abfragen.
Code:
So in etwa sieht bei mir eine Manifest.xml aus wenn ich ein Programm erstelle das:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <assemblyIdentity processorArchitecture="*" version="5.1.0.0" type="win32" name="Microsoft.Windows.Themes"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="x86"/> </dependentAssembly> </dependency> <description>Activate native Themes support</description> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"></supportedOS> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"></supportedOS> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS> </application> </compatibility> <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> <autoElevate>true</autoElevate> </asmv3:windowsSettings> </asmv3:application> </assembly> Themes sind aktiviert Admin-Rechte einfordern Verschiedenen Windows Versionen (ab Vista) mitteilen das es die mag, ist das damit gemeint? (supportedOS Id) Oder ist es ein Befehl im Code der ausgeführt werden muss? Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 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