Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Info-Fenster von Windows anzeigen

  Alt 17. Aug 2015, 21: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 21:20 Uhr)
  Mit Zitat antworten Zitat