Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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.


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

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