Gönderen Konu: Programın/Dosyanın windows Default ikonunu bulup göstermek  (Okunma sayısı 572 defa)

Çevrimdışı nadir_pıero

  • Osc Çizik Üye

  • 3. SINIF UYE
  • *
  • İleti: 3.539
  • Puan -101
  • Cinsiyet: Bay
    • MSN Messenger - nadir_piero10@hotmail.com
    • Profili Görüntüle
    • E-Posta
{
orijinal kod
http://www.swissdelphicenter.ch/en/showcode.php?id=218
adresinden alınmıştır.
Fakat kod tam çalışmıyordu. Biraz değişiklik yaptım şuanda bütün dosyaların
ilişkili ikonlarını gösteriyor
}

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, FileCtrl,variants;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  PHICON = ^HICON;

var
  Form1: TForm1;
  PLargeIcon, PSmallIcon: phicon;

implementation

uses shellapi, registry;

{$R *.dfm}
procedure GetAssociatedIcon(FileName: TFilename; PLargeIcon, PSmallIcon: PHICON);
var
  IconIndex: SmallInt;
  Icono: PHICON;
  FileExt, FileType: string;
  Reg: TRegistry;
  p: Integer;
  p1, p2: PChar;
  buffer: array [0..255] of Char;

Label
  noassoc, NoSHELL;
  IconIndex := 0;
  Icono := nil;
  // ;Get the extension of the file
  FileExt := UpperCase(ExtractFileExt(FileName));
  //Eğer uzantı EXE veya ICO ise dosyadan alabiliriz
  // aksi takdirde registry den almamız gerekiyor
 
  if ((FileExt<>'.EXE') and (FileExt<>'.ICO')) and FileExists(FileName) then
  begin
    Reg := nil;
    try
      Reg := TRegistry.Create;
      Reg.RootKey := HKEY_CLASSES_ROOT;
      if FileExt = '.EXE' then FileExt := '.COM';
      if Reg.OpenKeyReadOnly(FileExt) then
        try
          FileType := Reg.ReadString('');
        finally
          Reg.CloseKey;
        end;
      if (FileType <> '') and Reg.OpenKeyReadOnly(FileType + '\DefaultIcon') then
        try
          FileName := Reg.ReadString('');
        finally
          Reg.CloseKey;
        end
        else
        if (FileType <> '') and Reg.OpenKeyReadOnly(FileType + '\Shell\Open\command') then
        try
          // bu kısım benim tarafımdan eklendir
          // eğer default icon yok ise o dosyayı açan programın iconunu gösteriyor
           FileName := Reg.ReadString('');
           delete(filename,pos('"',filename),1);
           if pos('"',filename)>0 then filename:=copy(filename,1,pos('"',filename)-1);
           if pos('%1',filename)>0 then filename:=copy(filename,1,pos('%1',filename)-1);
        finally
             Reg.CloseKey;
        end;

    finally
      Reg.Free;
    end;

    if FileName = '' then goto noassoc;
    p1 := PChar(FileName);
    p2 := StrRScan(p1, ',');
    if p2<>nil then
    begin
      p         := p2 - p1 + 1; // Position de la coma
      IconIndex := StrToInt(Copy(FileName, p + 1, Length(FileName) - p));
      SetLength(FileName, p - 1);
    end;
  end;
 
  if ExtractIconEx(PChar(FileName), IconIndex, Icono^, PSmallIcon^, 1) <> 1 then
  begin
    noassoc:

    FileName := 'C:\Windows\System\SHELL32.DLL';
    if not FileExists(FileName) then
    begin
      GetWindowsDirectory(buffer, SizeOf(buffer));
      FileName := FileSearch('SHELL32.DLL', GetCurrentDir + ';' + buffer);
      if FileName = '' then
        goto NoSHELL;
    end;


    if (FileExt = '.DOC') then IconIndex := 1
    else if (FileExt = '.EXE') or (FileExt = '.COM') then IconIndex := 2
    else if (FileExt = '.HLP') then IconIndex := 23
    else if (FileExt = '.INI') or (FileExt = '.INF') then IconIndex := 63
    else if (FileExt = '.TXT') then IconIndex := 64
    else if (FileExt = '.BAT') then IconIndex := 65
    else if (FileExt = '.DLL') or (FileExt = '.SYS') or (FileExt = '.VBX') or
      (FileExt = '.OCX') or (FileExt = '.VXD') then IconIndex := 66
    else if (FileExt = '.FON') then IconIndex := 67
    else if (FileExt = '.TTF') then IconIndex := 68
    else if (FileExt = '.FOT') then IconIndex := 69
    else
      IconIndex := 0;

    if ExtractIconEx(PChar(FileName), IconIndex, Icono^, PSmallIcon^, 1) <> 1 then
    begin
      NoSHELL:
      if PLargeIcon=nil then PLargeIcon^ := 0;
      if PSmallIcon=nil then PSmallIcon^ := 0;
    end;
  end;

  if PSmallIcon^<>0 then
  begin
    PLargeIcon^ := ExtractIcon(Application.Handle, PChar(FileName), IconIndex);
    if PLargeIcon^=Null then
      PLargeIcon^ := 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SmallIcon, LargeIcon: HIcon;
  Icon: TIcon;
begin
  if not (OpenDialog1.Execute) then
    Exit;
  Icon := TIcon.Create;
  try
    GetAssociatedIcon(OpenDialog1.FileName, @LargeIcon, @SmallIcon);
    if LargeIcon <> 0 then
    begin
      Icon.Handle := LargeIcon;
      Image2.Picture.icon := Icon;
    end;
    if SmallIcon <> 0 then
    begin
      Icon.Handle := SmallIcon;
      Image1.Picture.icon := Icon;
    end;
  finally
    Icon.Destroy;
  end;
end;

end.

Çevrimdışı LeGeND-MæN

  • 1. SINIF ÜYE
  • *****
  • İleti: 25.719
  • Puan 1937
  • Cinsiyet: Bay
  • Mangal Yürekli Adam
    • Profili Görüntüle
Programın/Dosyanın windows Default ikonunu bulup göstermek
« Yanıtla #1 : 03 Mart 2007, 14:36:30 »
emeğine sağlık..
tarz yaratmak için Ağır Abi OLma!! Ağır Abi Dediğin Sevdimi Tam Sever Giydiğini herkez Beğenir, Saygısı Sonsuz Sevgisi Ebedi Olur..

DAĞLARINA DARGIMIM YAR...



Çevrimdışı YuRY

  • 1. SINIF ÜYE
  • *****
  • İleti: 17.264
  • Puan 1606
  • Cinsiyet: Bay
    • MSN Messenger - Tr_YuRY@hotmail.com
    • Profili Görüntüle
Programın/Dosyanın windows Default ikonunu bulup göstermek
« Yanıtla #2 : 04 Mart 2007, 07:30:05 »
SAOL NADİR REP+

Çevrimdışı N0RM

  • 2. SINIF UYE
  • ****
  • İleti: 6.136
  • Puan 310
  • Cinsiyet: Bay
  • Narq0z
    • Profili Görüntüle
    • E-Posta
Programın/Dosyanın windows Default ikonunu bulup göstermek
« Yanıtla #3 : 06 Nisan 2007, 21:39:03 »
paylaşım için saol