Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Win & Dos Versions Nummern abfragen. (https://www.delphipraxis.net/195613-win-dos-versions-nummern-abfragen.html)

KodeZwerg 13. Mär 2018 23:42


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:
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));
diesen Code benutzt, sollte ich meinen Code updaten für Delphi (Tokyo) oder ist das alles noch konform?

Daniel 14. Mär 2018 05:22

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.
https://msdn.microsoft.com/de-de/lib...sktop/ms724439

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.

hoika 14. Mär 2018 05:41

AW: Win & Dos Versions Nummern abfragen.
 
Hallo,
für Windows fragt man am besten die Version der Datei kernel32.dll ab

Bernhard Geyer 14. Mär 2018 08:43

AW: Win & Dos Versions Nummern abfragen.
 
DOS-Version - Gibts seit Windows95 nicht mehr.

matashen 14. Mär 2018 08:47

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

KodeZwerg 14. Mär 2018 09:29

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 -> eine andere Sichtweise

Redeemer 14. Mär 2018 10:25

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1396033)
DOS-Version - Gibts seit Windows95 nicht mehr.

Du hast „Windows NT“ falsch geschrieben. In Windows Me gab es noch MS-DOS 8.00, startbar war es nur bis 7.10 in Windows 98.

Bernhard Geyer 14. Mär 2018 12:16

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von Redeemer (Beitrag 1396057)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1396033)
DOS-Version - Gibts seit Windows95 nicht mehr.

Du hast „Windows NT“ falsch geschrieben. In Windows Me gab es noch MS-DOS 8.00, startbar war es nur bis 7.10 in Windows 98.

Ok. Win 9x hat noch ein DOS "Im Bauch".
Aber alles unter XP kann man wohl als "Antike OS-Versionen" betrachten und XP als "OldTimer"

EWeiss 14. Mär 2018 14:24

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Ps: An Daniel, was lässt Dich vermuten das ich Hilfe ablehne wenn ich doch der Fragestellende bin?
Er wird schon seinen Grund haben.

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

Daniel 14. Mär 2018 14:37

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von EWeiss (Beitrag 1396123)
Zumindest kann er jemanden anhand der IP identifizieren [...]

Emil ... glücklicherweise ist mein Leben zu auf- und anregend, als dass ich Muße hätte, hier IP-Adressen zu notieren und anonyme Benutzer zu verfolgen. Mit welchem persönlichen Nutzen?
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.

himitsu 14. Mär 2018 15:14

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von Daniel (Beitrag 1396125)
das MSDN ist seit vielen, vielen Jahren eine hochwertige Informationsquelle.

Und wem das nicht reicht, der kann sich auch noch das Windows SDK besorgen (ehemals PSDK).

Nicht jeder Typ oder jede Konstante ist haargenau im MSDN inkl. Wert / kompletter Definition genannt, aber im SDK ist alles drin.

KodeZwerg 14. Mär 2018 15:21

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.

KodeZwerg 14. Mär 2018 18:18

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von hoika (Beitrag 1396021)
für Windows fragt man am besten die Version der Datei kernel32.dll ab

Das habe ich nun auch versucht, mit der GetFileVersionInfo funktion.
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:
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;
In einem Demo Projekt mit gleichem Code nur auf eine Datei im selben Verzeichniss angewendet klappt alles,
wenn ich nun die .exe zur kernel32.dll hinkopiere bleibt der Fehler bestehen.

Frickler 15. Mär 2018 10:02

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von hoika (Beitrag 1396021)
Hallo,
für Windows fragt man am besten die Version der Datei kernel32.dll ab

Wenns egal ist, dass der Code nur auf Windows 2000 aufwärts funktioniert, ist die Funktion "RTLGetVersion" das Mittel der Wahl, zumindest für mich. Gibt die richtige Version zurück, auch ohne, dass das Programm ein Manifest haben müsste. Die Funktion ist selbst in Delphi 10.2.3 nicht in der Basisbibliothek enthalten, muss man also selbst einbauen.

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;

KodeZwerg 15. Mär 2018 12:03

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:

MEissing 15. Mär 2018 12:06

AW: Win & Dos Versions Nummern abfragen.
 
Warum nicht TOSVersion benutzen?

http://docwiki.embarcadero.com/RADSt.../de/TOSVersion

himitsu 15. Mär 2018 12:40

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:

Frickler 15. Mär 2018 12:47

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Zitat von MEissing (Beitrag 1396213)

Vielleicht weil das nur mit den neusten Delphi-Versionen korrekte Werte ab Windows 8.1 aufwärts ausgibt? Die Version, die bei XE6 dabei ist erzählt mir, mein Windows 10 wäre "Windows 8 (Version 6.2, Build 0, 64-Bit-Edition)" solange ich keine Manifest-Datei verwende.

KodeZwerg 15. Mär 2018 12:52

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:
//...
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';
Klein, schnell und funktionell.

bra 15. Mär 2018 13:00

AW: Win & Dos Versions Nummern abfragen.
 
Ich meine, dass wenn du keine Manifest-Datei verwendest, dein Programm sowieso nur im Kompatibilitätsmodus läuft.

KodeZwerg 15. Mär 2018 13:16

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.

günni0 15. Mär 2018 13:29

AW: Win & Dos Versions Nummern abfragen.
 
Zitat:

Ich weiß auch nicht wie ich per Code Abfragen kann in welchen Modus mein Programm gestartet wurde (Kompatibilitätsmodus, wenn ja, welcher?).
Das steht normalerweise in der Registry.

himitsu 15. Mär 2018 13:29

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.

KodeZwerg 15. Mär 2018 14:21

AW: Win & Dos Versions Nummern abfragen.
 
Code:
<?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>
So in etwa sieht bei mir eine Manifest.xml aus wenn ich ein Programm erstelle das:
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:

Stattdessen sollte man sein Programm für die bekannten Versionen kompatibel machen und sagt dann Windows welche Versionen es sind.


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