Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Info-Fenster von Windows anzeigen (https://www.delphipraxis.net/186236-info-fenster-von-windows-anzeigen.html)

DeddyH 17. Aug 2015 19:34

AW: Info-Fenster von Windows anzeigen
 
Zitat:

Zitat von EWeiss (Beitrag 1312468)
Zitat:

Hallo Hathor, dass klappt auch, danke.
Und auch nur das dein Lösungsansatz.

U.U. stimmen die Parametertypen aber nicht, je nach Delphi-Version.
ShellExecuteA -> PAnsiChar
ShellExecuteW -> PWideChar
ShellExecute -> PChar

jaenicke 17. Aug 2015 19:58

AW: Info-Fenster von Windows anzeigen
 
Zitat:

Zitat von Willie1 (Beitrag 1312459)
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.

Du musst in deinem Anwendungsmanifest angeben, dass deine Anwendung mit Windows 10 kompatibel ist, dann wird auch alles korrekt angezeigt.

Da war Microsoft wohl etwas zu gründlich beim Umbiegen der Versionsfunktionen, so dass sie den eigenen Dialog betreffen.

EWeiss 17. Aug 2015 20:02

AW: Info-Fenster von Windows anzeigen
 
Zitat:

Zitat von jaenicke (Beitrag 1312475)
Zitat:

Zitat von Willie1 (Beitrag 1312459)
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.

Du musst in deinem Anwendungsmanifest angeben, dass deine Anwendung mit Windows 10 kompatibel ist, dann wird auch alles korrekt angezeigt.

Da war Microsoft wohl etwas zu gründlich beim Umbiegen der Versionsfunktionen, so dass sie den eigenen Dialog betreffen.

Wie ich vorhin noch gelesen habe gilt das mit GetVersionEx?
Sorry hab kein Win10.

GetVersionEx
Manifest

gruss

hathor 17. Aug 2015 20:46

AW: Info-Fenster von Windows anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DeddyH (Beitrag 1312473)
Zitat:

Zitat von EWeiss (Beitrag 1312468)
Zitat:

Hallo Hathor, dass klappt auch, danke.
Und auch nur das dein Lösungsansatz.

U.U. stimmen die Parametertypen aber nicht, je nach Delphi-Version.
ShellExecuteA -> PAnsiChar
ShellExecuteW -> PWideChar
ShellExecute -> PChar

Gelaber!

Sir Rufo 17. Aug 2015 21:08

AW: Info-Fenster von Windows anzeigen
 
Bei UNICODE Delphis sollte die Verweise so stehen
Delphi-Quellcode:
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeW'; // <- da
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA';
function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW';
und bei ANSI Delphis so
Delphi-Quellcode:
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeA'; // <- da
function GetFileVersionInfoSizeA; external version name 'GetFileVersionInfoSizeA';
function GetFileVersionInfoSizeW; external version name 'GetFileVersionInfoSizeW';
und schon ist die Welt wieder hübsch in Ordnung.

Nur wenn man explizit die ANSI oder UNICODE Variante haben möchte, dann muss man die auch aufrufen mit den richtigen Typen.

Sir Rufo 17. Aug 2015 21:15

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:
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;
Wenn es jetzt knallt, bekommt man auch noch direkt mit, welcher Aufruf zickt.

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;

DeddyH 18. Aug 2015 08:03

AW: Info-Fenster von Windows anzeigen
 
Zitat:

Zitat von hathor (Beitrag 1312484)
Zitat:

Zitat von DeddyH (Beitrag 1312473)
Zitat:

Zitat von EWeiss (Beitrag 1312468)
Zitat:

Hallo Hathor, dass klappt auch, danke.
Und auch nur das dein Lösungsansatz.

U.U. stimmen die Parametertypen aber nicht, je nach Delphi-Version.
ShellExecuteA -> PAnsiChar
ShellExecuteW -> PWideChar
ShellExecute -> PChar

Gelaber!

Dann mach dasselbe doch mal mit Delphi <= 2007.

Sir Rufo 18. Aug 2015 08:20

AW: Info-Fenster von Windows anzeigen
 
Zitat:

Zitat von DeddyH (Beitrag 1312520)
Dann mach dasselbe doch mal mit Delphi <= 2007.

Kann man bei Delphi vor der Version 2007 das hier nicht schreiben?
Delphi-Quellcode:
function GetFileVersionInfoSize; external version name 'GetFileVersionInfoSizeA';
Wäre mir jetzt neu ...

DeddyH 18. Aug 2015 08:25

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".

Sir Rufo 18. Aug 2015 08:36

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:
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.
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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz