Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Function (WIMGetMountedImageInfo)

  Alt 18. Dez 2013, 00:39
@Zacherl

Folgendes würde ich ändern
  • Wenn Delphi-Referenz durchsuchenLoadLibrary dann auch Delphi-Referenz durchsuchenFreeLibrary inkl. Fehlerbehandlung (Exception)
  • Delphi-Referenz durchsuchenGetLastError nur einmal aufrufen
    Zitat:
    Der Aufruf dieser Funktion setzt in der Regel den Fehlerstatus des Betriebssystems zurück.
  • Da alle anderen Fehlermeldungen in diesem Kontext eine Ausnahme sind, würde ich auch eine Exception werfen
  • Statt PChar auf jeden Fall PWideChar nehmen, denn hier gibt es nur WCHAR (und PChar ist abhängig vom Compiler -> bei der nächsten Umstellung des Standard-String-Typs sind wieder alle am Weinen ).
    Wenn sich die API ändert, dann ändert die sich eben ... nachführen
Delphi-Quellcode:
var
  Lwimgapi : HMODULE;
  LSuccess : Boolean;
  LBuffer : PWIM_MOUNT_INFO_LEVEL0_LIST;
  LBufferLength, LReturnLength, LImageCount : DWord;
  LIdx : Integer;
  LLastError : Cardinal;

begin
  Lwimgapi := LoadLibrary( 'wimgapi.dll' );
  if Lwimgapi = 0
  then
    RaiseLastOSError;

  try
    @WIMGetMountedImageInfo := GetProcAddress( Lwimgapi, 'WIMGetMountedImageInfo' );
    LBufferLength := SizeOf( WIM_MOUNT_INFO_LEVEL0 ) * 8;
    GetMem( LBuffer, LBufferLength );
    try
      repeat
        LSuccess := WIMGetMountedImageInfo( MountedImageInfoLevel0, LImageCount, LBuffer, LBufferLength, LReturnLength );
        if LSuccess
        then
          begin
            for LIdx := 0 to LImageCount - 1 do
              begin
                ShowMessage( StrPas( PWideChar( @LBuffer^[LIdx].WimPath[0] ) ) );
              end;
          end
        else
          begin
            LLastError := GetLastError;
            case LLastError of
              ERROR_INSUFFICIENT_BUFFER :
                begin
                  ReallocMem( LBuffer, LReturnLength );
                end;
            else
              RaiseLastOSError( LLastError );
            end;
          end;
      until LSuccess;
    finally
      FreeMem( LBuffer );
    end;
  finally
    FreeLibrary( Lwimgapi );
  end;
end;
EDIT
GetProcAddress ist auch noch ein Kandidat zum Prüfen ... aber jetzt nicht mehr
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 (18. Dez 2013 um 00:51 Uhr)
  Mit Zitat antworten Zitat