AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Welche Auflösungen besitzt ein *.ico-File
Thema durchsuchen
Ansicht
Themen-Optionen

Welche Auflösungen besitzt ein *.ico-File

Ein Thema von SittingDuck · begonnen am 15. Feb 2007 · letzter Beitrag vom 1. Jul 2012
 
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 18. Feb 2007, 23: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz