Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
Delphi 10 Seattle Enterprise
|
AW: Info-Fenster von Windows anzeigen
17. Aug 2015, 22:15
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
Geändert von Sir Rufo (17. Aug 2015 um 22:20 Uhr)
|