AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Win & Dos Versions Nummern abfragen.

Ein Thema von KodeZwerg · begonnen am 13. Mär 2018 · letzter Beitrag vom 15. Mär 2018
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: Win & Dos Versions Nummern abfragen.

  Alt 14. Mär 2018, 15:14
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#12

AW: Win & Dos Versions Nummern abfragen.

  Alt 14. Mär 2018, 15:21
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#13

AW: Win & Dos Versions Nummern abfragen.

  Alt 14. Mär 2018, 18:18
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
184 Beiträge
 
Delphi XE6 Enterprise
 
#14

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 10:02
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;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#15

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 12:03
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Benutzerbild von MEissing
MEissing

Registriert seit: 19. Jan 2005
Ort: Egelsbach
953 Beiträge
 
Delphi 10.3 Rio
 
#16

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 12:06
Warum nicht TOSVersion benutzen?

http://docwiki.embarcadero.com/RADSt.../de/TOSVersion
Matthias Eißing
cu://Matthias.Eißing.de [Embarcadero]
Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 12:40
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
184 Beiträge
 
Delphi XE6 Enterprise
 
#18

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 12:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#19

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 12:52
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
704 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#20

AW: Win & Dos Versions Nummern abfragen.

  Alt 15. Mär 2018, 13:00
Ich meine, dass wenn du keine Manifest-Datei verwendest, dein Programm sowieso nur im Kompatibilitätsmodus läuft.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf