![]() |
Info-Fenster von Windows anzeigen
Hallo Leute,
ich möchte das Info-Fenster von Windows, dass die aktuelle Windows Version, auch für 10 anzeigt, aus einem eigenen Programm aufrufen.Wie mache ich das? Lässt sich auch mit Powershell winver anzeigen. Danke und Gruß Willie. |
AW: Info-Fenster von Windows anzeigen
Versuch doch mal die winver.exe im Windows-Systemverzeichnis. ;)
|
AW: Info-Fenster von Windows anzeigen
meinst du so?
Delphi-Quellcode:
type
TVersionInfo = packed record Major : DWORD; Minor : DWORD; Release: DWORD; Build : DWORD; end; {...} var S : String; VersionInfo: TVersionInfo; begin VersionInfo := GetFileVersion(PWideChar(Application.ExeName)); S := Format('Copyright by me!' + #13 + 'Version: %d.%d.%d.%d', [VersionInfo.Major, VersionInfo.Minor, VersionInfo.Release, VersionInfo.Build]); ShellAbout(self.Handle, PWideChar(Text), PWideChar(S), Application.Icon.Handle); end; |
AW: Info-Fenster von Windows anzeigen
Parameter von WINVER.exe gibt es bis WIN8.1 nicht.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var strParams,FN : String; begin // uses Winapi.ShellAPI strParams:= ''; // für Programme MIT Parameter FN:='winver.exe'; ShellExecute(Application.Handle,NIL,PWChar(FN), PWChar(strParams),NIL, SW_Normal); end; |
AW: Info-Fenster von Windows anzeigen
Hallo Helmi,
dein Code ist genau das, was ich mir vorgestellt habe!!! Auch als Hobby-Programmierer will man eine schöne About-Box haben. Nur mit GetFileVersion habe ich ein Problem, es liefert einen Cardinal-Wert zurüch: Hiword enthält Hauptversion, Loword Nebenversion, kein Release und Built. Aber ich habe ein Codeschnipzel von Luckie gefunden. Die Windows-Infobox ist ja nützlich, weil sich die Windowsversion seit 8.1 nicht mehr so leicht ermitteln lässt. Von ShellAbout habe ich noch nie etwas gehört, obwohl ich viel in Delphiforen gesucht habe. Hallo Hathor, dass klappt auch, danke. Gruß Willie. |
AW: Info-Fenster von Windows anzeigen
Nachtrag:
Meine Begeisterung für eine About-Box (ShellAbout) mit Windows lässt schnell nach. Unter Windows 10 wird Text in der Kopfzeile stur ignoriert (immer nur Info) und es wird dann die falsche Windows-Version angezeigt Version 6.2 (Built 9200) also Windows 8. Ohne ShellAbout stimmt die Windows Version 10.0. Built 10240. Willie |
AW: Info-Fenster von Windows anzeigen
Hallo,
sorry, hab übersehen, dass "GetFileVersion" eine eigene Procedure ist. Hier mal der gesamte (Test-)Code:
Delphi-Quellcode:
unit Unit2;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ShellAPI; type TVersionInfo = packed record Major : DWORD; Minor : DWORD; Release: DWORD; Build : DWORD; end; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} function GetFileVersion(const FileName: PWideChar): TVersionInfo; var VerInfoSize : Integer; VerValueSize: DWord; Dummy : DWord; VerInfo : Pointer; VerValue : PVSFixedFileInfo; begin VerInfoSize := GetFileVersionInfoSize(Filename,Dummy); If VerInfoSize <> 0 then begin GetMem(VerInfo, VerInfoSize); try If GetFileVersionInfo(Filename, 0, VerInfoSize,VerInfo) then If VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize) then begin Result.Major := VerValue^.dwFileVersionMS shr 16; Result.Minor := VerValue^.dwFileVersionMS and $FFFF; Result.Release := VerValue^.dwFileVersionLS shr 16; Result.Build := VerValue^.dwFileVersionLS and $FFFF; end; finally FreeMem(VerInfo, VerInfoSize); end; end; end; procedure TForm2.Button1Click(Sender: TObject); var S : String; VersionInfo: TVersionInfo; begin VersionInfo := GetFileVersion(PWideChar(Application.ExeName)); S := Format('Copyright by me!' + #13 + 'Version: %d.%d.%d.%d', [VersionInfo.Major, VersionInfo.Minor, VersionInfo.Release, VersionInfo.Build]); ShellAbout(self.Handle, PWideChar(Text), PWideChar(S), Application.Icon.Handle); end; end. |
AW: Info-Fenster von Windows anzeigen
Verpasse ich irgendetwas, oder redet Ihr an einander vorbei? Was soll denn nun angezeigt werden, die Windows-Version oder die Versionsinfos des eigenen Programms?
|
AW: Info-Fenster von Windows anzeigen
Zitat:
Der Beitrag von hathor ist relevant. Wie auch immer ;) Zitat:
gruss |
AW: Info-Fenster von Windows anzeigen
Zitat:
und der zeigt ja die Windoof-Version an + einen eigenen Text (bei mir die eigene Programmversion) zeigt nur den Windows-Text an - sonst gar nix - echt - gar nix: :mrgreen:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin ShellAbout(self.Handle, PWideChar(''), PWideChar(''), 0); end; |
AW: Info-Fenster von Windows anzeigen
Zitat:
ShellExecuteA -> PAnsiChar ShellExecuteW -> PWideChar ShellExecute -> PChar |
AW: Info-Fenster von Windows anzeigen
Zitat:
Da war Microsoft wohl etwas zu gründlich beim Umbiegen der Versionsfunktionen, so dass sie den eigenen Dialog betreffen. |
AW: Info-Fenster von Windows anzeigen
Zitat:
Sorry hab kein Win10. ![]() ![]() gruss |
AW: Info-Fenster von Windows anzeigen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: Info-Fenster von Windows anzeigen
Bei UNICODE Delphis sollte die Verweise so stehen
Delphi-Quellcode:
und bei ANSI Delphis so
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeW'; // <- da
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA'; function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW';
Delphi-Quellcode:
und schon ist die Welt wieder hübsch in Ordnung.
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeA'; // <- da
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA'; function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW'; Nur wenn man explizit die ANSI oder UNICODE Variante haben möchte, dann muss man die auch aufrufen mit den richtigen Typen. |
AW: Info-Fenster von Windows anzeigen
Es ist im Allgemeinen schon ratsam die Rückgabewerte der API Funktionen nicht nur zu prüfen, sondern auch die Exeptions werfen zu lassen.
Delphi-Quellcode:
Wenn es jetzt knallt, bekommt man auch noch direkt mit, welcher Aufruf zickt.
function GetFileVersion( const AFileName: string ): TVersion; // <- selber definiert
var VersionInfoSize : DWORD; VersionInfo : Pointer; VersionValueSize: DWORD; VersionValueData: PVSFixedFileInfo; begin VersionInfoSize := CheckApiNotZero( netAlike.Winapi.Windows.GetFileVersionInfoSize( PChar( AFileName ), nil ), // <- selber richtig deklariert 'GetFileVersionInfoSize( %s )', [ AFileName ] ); GetMem( VersionInfo, VersionInfoSize ); try CheckApiResult( GetFileVersionInfo( PChar( AFileName ), 0, VersionInfoSize, VersionInfo ), 'GetFileVersionInfo( %s )', [ AFileName ] ); CheckApiResult( VerQueryValue( VersionInfo, '\', Pointer( VersionValueData ), VersionValueSize ), 'VerQueryValue( %s, "\" )', [ AFileName ] ); Result := TVersion.CreateFromMSLS( VersionValueData.dwFileVersionMS, VersionValueData.dwFileVersionLS ); // <- dann wird das auch leichter finally FreeMem( VersionInfo, VersionInfoSize ); end; end; procedure CheckApiResult( ApiCallResult: BOOL; const AdditionalInfo: string; const Args: array of const ); overload; begin if not ApiCallResult then RaiseLastOSError( GetLastError, string.Format( sLineBreak + AdditionalInfo, Args ) ); end; procedure CheckApiResult( ApiCallResult: BOOL; const AdditionalInfo: string ); begin CheckApiResult( ApiCallResult, AdditionalInfo, [ ] ); end; function CheckApiNotZero( ApiCallResult: DWORD; const AdditionalInfo: string; const Args: array of const ): DWORD; overload; begin if ApiCallResult = 0 then RaiseLastOSError( GetLastError, string.Format( sLineBreak + AdditionalInfo, Args ) ); Result := ApiCallResult; end; function CheckApiNotZero( ApiCallResult: DWORD; const AdditionalInfo: string ): DWORD; begin Result := CheckApiNotZero( ApiCallResult, AdditionalInfo, [ ] ); end; Wer das mit den Zusatzinfos nicht benötigt, bekommt dadurch ein sehr kurze und übersichtliche Routine:
Delphi-Quellcode:
function GetFileVersion( const AFileName: string ): TVersion; // <- selber definiert
var VersionInfoSize : DWORD; VersionInfo : Pointer; VersionValueSize: DWORD; VersionValueData: PVSFixedFileInfo; begin VersionInfoSize := CheckApiNotZero( netAlike.Winapi.Windows.GetFileVersionInfoSize( PChar( AFileName ), nil ) ); GetMem( VersionInfo, VersionInfoSize ); try CheckApiResult( GetFileVersionInfo( PChar( AFileName ), 0, VersionInfoSize, VersionInfo ) ); CheckApiResult( VerQueryValue( VersionInfo, '\', Pointer( VersionValueData ), VersionValueSize ) ); Result := TVersion.CreateFromMSLS( VersionValueData.dwFileVersionMS, VersionValueData.dwFileVersionLS ); // <- dann wird das auch leichter finally FreeMem( VersionInfo, VersionInfoSize ); end; end; |
AW: Info-Fenster von Windows anzeigen
Zitat:
|
AW: Info-Fenster von Windows anzeigen
Zitat:
Delphi-Quellcode:
Wäre mir jetzt neu ...
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeA';
|
AW: Info-Fenster von Windows anzeigen
Und das hat genau was mit meinem Post zu tun? ShellExecute ist in Delphi <= 2007 als ShellExecuteA deklariert und erwartet PAnsiChar-Parameter (entspricht PChar in diesen Versionen). Ab Delphi 2009 ist es ShellExecuteW mit PWideChar-Parametern (entspricht dann hier PChar). Der Compiler weiß natürlich, von welchem Ursprungstyp PChar ist und zeigt diesen dann im Hint an. Von daher hat der gepostete Screenshot keine "Beweiskraft".
|
AW: Info-Fenster von Windows anzeigen
Wenn man es vernünftig haben will, dann nimmt erstellt man sich eine Unit, wo man a) die Api-Aufrufe korrekt deklariert und b) UNICODE / ANSI safe ist.
So sähe das dann aus:
Delphi-Quellcode:
Das dieses so in den Delphi-Versionen vor Delphi 2007 nicht gemacht wurde, dafür kann ich auch nichts, aber man hat es eben selber in der Hand, ob man es vernünftig, korrekt und sicher hat ;)
unit myWindows,
interface uses Windows; type LPCTSTR = PChar; LPCSTR = PAnsiChar; LPCWSTR = PWideChar; {$EXTERNALSYM GetFileVersionInfoSize} function GetFileVersionInfoSize(lptstrFilename: LPCTSTR; lpdwHandle: LPDWORD): DWORD; stdcall; {$EXTERNALSYM GetFileVersionInfoSizeA} function GetFileVersionInfoSizeA(lptstrFilename: LPCSTR; lpdwHandle: LPDWORD): DWORD; stdcall; {$EXTERNALSYM GetFileVersionInfoSizeW} function GetFileVersionInfoSizeW(lptstrFilename: LPCWSTR; lpdwHandle: LPDWORD): DWORD; stdcall; implementation function GetFileVersionInfoSize; external version name {$IFDEF UNICODE} 'GetFileVersionInfoSizeW' {$ELSE} 'GetFileVersionInfoSizeA' {$ENDIF}; function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA'; function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW'; end. |
AW: Info-Fenster von Windows anzeigen
Aber auch dann muss man die richtigen Parametertypen verwenden.
|
AW: Info-Fenster von Windows anzeigen
Zitat:
Genau das steht auch in der ![]() Zitat:
Delphi-Quellcode:
type
LPCTSTR = PChar; LPCSTR = PAnsiChar; LPCWSTR = PWideChar; |
AW: Info-Fenster von Windows anzeigen
Das ist doch exakt das, was ich vorher gesagt habe und was als Quatsch abgetan wurde, weil die IDE im Hint ja den Ursprungstypen anzeigt. Wir drehen uns im Kreis.
|
AW: Info-Fenster von Windows anzeigen
Zitat:
Delphi-Quellcode:
und
PChar
Delphi-Quellcode:
von ganz alleine.
GetFileVersionSize
|
AW: Info-Fenster von Windows anzeigen
Zitat:
|
AW: Info-Fenster von Windows anzeigen
Zitat:
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var strParams,FN : String; begin // uses Winapi.ShellAPI strParams:= ''; // für Programme MIT Parameter FN:='winver.exe'; ShellExecute( Application.Handle, NIL, {PWChar ist hier FALSCH}PChar(FN), {PWChar}PChar(strParams), NIL, SW_Normal ); end; |
AW: Info-Fenster von Windows anzeigen
Jetzt sind wir uns endlich einig :thumb:. Der Hinweis mit der Delphi-Version bezog sich auf den Screenshot.
|
AW: Info-Fenster von Windows anzeigen
Was ist das hier eigentlich?
Eine Hetzjagd? SCHEISSGELABER !!! Gibt es hier keinen Moderator, der den ganzen Scheiss mal rauswirft???!!! |
AW: Info-Fenster von Windows anzeigen
Also uns geht es um die Fakten und die sachliche Richtigkeit.
Worum geht es dir? Ruhm, Ehre, Anerkennung, ... :gruebel: |
AW: Info-Fenster von Windows anzeigen
Hallo Leute,
der Ausgangspunkt meiner Frage war, eine About-Box für meine eigenen Programme. In dieser zeige ich zusätzlich meine eigene Ikone, die Windows-Version und die Größe des Arbeitsspeichers. Ab Windows 8.1 lässt die Version nicht mehr mit GetWindowsVersion und seit W 10 auch nicht mehr über die Registry abfragen. Meine Idee war ein Button auf der About-Box, mit der sich das Windows-Info Fenster öffnen lässt. (Bei Vista wird hier auch der Arbeitsspeicher angezeigt, nicht bei W 10). Da kam mir Helmis Vorschlag mit ShellAbout gerade recht: About-Box Und Windows-Info zusammen! Ich stelle aber fest, dass Win 10 den individuellen Kopftext ignoriert und die falsche Windows Version 6.2 9200 anzeigt. Wenn ich die Lösung von Hathor nehme, wird dagegen die richtige Version 10.0.10240 angezeigt. Ihr könnt es ausprobieren. Willie. |
AW: Info-Fenster von Windows anzeigen
Darum ging es uns auch gar nicht, sondern um die falschen Parametertypen. Schau Dir doch die korrigierte Fassung aus
![]() |
AW: Info-Fenster von Windows anzeigen
Zitat:
Zitat:
MfG Dalai |
AW: Info-Fenster von Windows anzeigen
Zitat:
Deshalb sollte/könnte man auch das hier nehmen. ![]() ![]() gruss |
AW: Info-Fenster von Windows anzeigen
Es funktioniert wunderbar, wenn man sich die Version von "kernel32.dll" beschafft.
Delphi-Quellcode:
AppVersion := GetFileVersion( ParamStr(0) );
WinVersion := GetFileVersion( 'kernel32.dll' ); // liefert die echte Windows-Version |
AW: Info-Fenster von Windows anzeigen
Hallo Dalai,
ich will's nicht so oft erwähnen, ich sehe schlecht und bin nur Hobby-Programmierer.. Ich habe die Seite bei MS gefunden und weiß jetzt, dass GetWindowsVersion ausgeknipst ist: ![]() Mit dem Manifest-Beispiel komme ich aber nicht zurecht, da fehlen mir die Grundlagen. Die weiteren Lösungen werde ich am anderen Rechner mit Delphi ausprobieren. Willie. |
AW: Info-Fenster von Windows anzeigen
Zitat:
Zitat:
MfG Dalai |
AW: Info-Fenster von Windows anzeigen
Interessant mit Sourcecode:
![]() ![]() |
AW: Info-Fenster von Windows anzeigen
|
AW: Info-Fenster von Windows anzeigen
Es ist die Frage wozu man es braucht. Nur zum Anzeigen kann man wohl die Version von der kernel32.dll nehmen. Will man aber sicherstellen, dass das Programm auch unter der angestrebten Windows Version lauffähig ist, sollte man gegen VerifyVersionInfo
![]() |
AW: Info-Fenster von Windows anzeigen
Hallo,
bei Delphi 10 Berlin liefert TOSVersion.ToString Windows 10(Version 10.0 Build 0 64-Bit-Edition) zurück. Schon besser aber nicht gut! TOSVersion.Check(6,3) gibt true zurück bei Windows 10. Gut! Ich habe gerade festgestellt, es ist völlig egal welche Werte ich eingebe z.B 0,0 oder 8,0, es ergibt immer true. Aber wenn der Programmierer mit dem Manifest selbst bestimmt, welche Version es sein soll, ist eine Abfrage wohl tatsächlich unnötig. Ich verstehe die Absicht von Microsoft nicht! Gruß Willie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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