Einzelnen Beitrag anzeigen

Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Welche Auflösungen besitzt ein *.ico-File

  Alt 19. Feb 2007, 00:43
Mit folgender Routine kann man prüfen, ob sich in *.ico- oder in PE- Dateien mit Ressourcen wie *.exe *.dll usw., sich Icone in einer bestimmten Auflösung befinden.
Die Funktion HasIcoSize() könnte man also vor der von SittingDuck gesendeten Routine aufrufen. Bei den von mir getesteten Dateien hat es bis jetzt funktioniert.
Falls noch einer Fehler in der Funktion findet, dann kann er sich ja dazu äußern, ich werde diese dann beheben.

Delphi-Quellcode:
type
  TResID = record
    ResInt: integer;
    ResString: AnsiString;
    isInteger: boolean;
end;

type
   PResID = ^TResID;

function EnumResIcon(Module: THandle; resType: PChar; HasIconGroup: PBool): bool; stdcall;
begin
  if resType = RT_GROUP_ICON then
  begin
    HasIconGroup^:= true;
    result:= false;
  end
  else
    result:= true;
end;

function EnumIconNames(Module: THandle; ResType, ResName: PChar; ResID: PResID): bool; stdcall;
begin
  if integer(resName)< $FFFF then
  begin
    ResID^.ResInt:= integer(ResName);
    ResID^.isInteger:= true;
  end
  else
  begin
    SetString(ResID^.ResString, ResName, Length(ResName));
    ResID^.isInteger:= false;
  end;
  result:= false;
end;

function HasIcoSize(IconPfad: AnsiString; IconSize: Byte): boolean;
var
  IconNr, IconAnzahl: byte;
  Next: cardinal;
  IconStream: TFileStream;
  ResStream: TResourceStream;
  Buffer: array of byte;
  FileExt: AnsiString;
  Lib: THandle;
  HasIcons: LongBool;
  ResID: TResID;
begin
  result:= false;
  if FileExists(IconPfad) then
  begin
    FileExt:= UpperCase(ExtractFileExt(IconPfad));
    if (FileExt= '.ICO') or (FileExt= '.CUR') then
    begin
      IconStream:= TFileStream.Create(IconPfad, fmOpenRead);
      try
        if IconStream.Seek(4, soFromCurrent)= 4 then
        if IconStream.Read(IconAnzahl, 1)= 1 then
        if IconStream.Seek(0, soFromBeginning)= 0 then
        begin
          Next:= 6;
          setlength(Buffer, IconAnzahl* 16);
          if IconStream.Read(Buffer[0], length(Buffer))= Length(Buffer) then
            for IconNr:= 1 to IconAnzahl do
            begin
              if (Buffer[Next]= IconSize) and (Buffer[Next+ 1]= IconSize) then
              begin
                result:= true;
                break;
              end;
              inc(Next, 16);
            end;
        end;
      finally
        IconStream.Free;
      end;
    end
    else
    begin
      Lib:= LoadLibraryEx(PChar(IconPfad), 0, LOAD_LIBRARY_AS_DATAFILE);
      if Lib<> 0 then
      try
        HasIcons:= false;
        EnumResourceTypes(Lib, @EnumResIcon, integer(@HasIcons));
        if HasIcons then
        begin
          EnumResourceNames(Lib, RT_GROUP_ICON, @EnumIconNames, integer(@ResID));
          if ResID.isInteger then
            ResStream:= TResourceStream.CreateFromID(Lib, ResID.ResInt, RT_GROUP_ICON)
          else
            ResStream:= TResourceStream.Create(Lib, ResID.ResString, RT_GROUP_ICON);
          try
            IconAnzahl:= byte(pointer(cardinal(ResStream.Memory)+ 4)^);
            Next:= 6;
            for IconNr:= 1 to IconAnzahl do
            begin
              if (byte(pointer(cardinal(ResStream.Memory)+ Next)^)= IconSize) and
                (byte(pointer(cardinal(ResStream.Memory)+ Next+ 1)^)= IconSize) then
              begin
                result:= true;
                break;
              end;
              inc(Next, 14);
            end;
          finally
            ResStream.Free;
          end;
        end;
      finally
        windows.FreeLibrary(Lib);
      end;
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.execute then
  if HasIcoSize(OpenDialog1.FileName, 48)then
    Showmessage('Die Datei hat Icone mit mit einer Größe von 48 X 48')
  else
    Showmessage('Die Datei hat KEINE Icone mit mit einer Größe von 48 X 48')
end;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat