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. GetVersionEx Manifest 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr. |
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