Solved

developing a file explorer

Posted on 1998-01-28
8
156 Views
Last Modified: 2010-04-04
While developing an file explorer I have problems extracting the small icon of the associated executable file.

The large on wasn't difficult: You only have to use the api call EXTRACTASSOCIATEDICON and you will get an iconhandle. The system metrics define the size of the returned icon. This ist 32x32 with normal screen resolution.

Thanks

Marc
0
Comment
Question by:M_Hoeper
  • 4
  • 2
  • 2
8 Comments
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1357712
Hi

You can use ShGetFileInfo to get large & small icon (and other stuff too).

E.g.
var
  shfi: TShFileInfo;
  Ico: TIcon;
  Filename: string;
begin
  Filename := 'C:\Autoexec.bat';

  // Get normal (32*32) icon.
  FillChar(shfi, SizeOf(TShFileInfo), 0);
  ShGetFileInfo(PChar(Filename), 0, shfi, SizeOf(TShFileInfo), SHGFI_ICON);
  Ico := TIcon.Create;
  Ico.Handle := shfi.hIcon;

  // Do something with icon, e.g. add to 32*32 TImageList:
  //imgLarge.AddIcon(Ico);

  Ico.Free;

  // Get small (16*16) icon.
  FillChar(shfi, SizeOf(TShFileInfo), 0);
  ShGetFileInfo(PChar(Filename), 0, shfi, SizeOf(TShFileInfo), SHGFI_ICON or SHGFI_SMALLICON);
  Ico := TIcon.Create;
  Ico.Handle := shfi.hIcon;

  // Do something with icon, e.g. add to 16*16 TImageList:
  //imgSmall.AddIcon(Ico);

  Ico.Free;



Regards,
JB
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1357713
P.S.  Add ShellApi to uses clause.
0
 
LVL 8

Expert Comment

by:ZifNab
ID: 1357714
Doesn't this works :

uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
  IconIndex : word;
  h : hIcon;
begin
  IconIndex := 0;
  h :=
    ExtractAssociatedIcon(hInstance,
                        'C:\WINDOWS\NOTEPAD.EXE',
                         IconINdex);

  DrawIcon(Form1.Canvas.Handle,
             10,
             10,
             h);

Zif.
0
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 
LVL 8

Expert Comment

by:ZifNab
ID: 1357715
Sorry, had a little delay. Didn't saw answer of JimBob.
0
 

Author Comment

by:M_Hoeper
ID: 1357716
Thanks for your answer.

SHGetFileInfo doesn't work with Windows NT (4) but my program have to run with NT.

I'm sorry that I didn't write it in my question.
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1357717
ShGetFileInfo does work on NT 4 (but not 3.51).  I have just run a sample app on an NT 4 machine, and it didn't work 1st time.  Then (without changing any code!!) I recompiled it, and ran it again and it worked...  That is very odd.

The 1st time it didn't work, it didn't even add it to the image list (imgLarge.Count = 0).  Maybe it didn't get a valid icon handle back.  Unfortunately, I can't go back and check because every time I run it now it works fine...

JB
0
 

Author Comment

by:M_Hoeper
ID: 1357718
Oh, sorry. I looked into the help file of dephi3. They write that the SHGetFileInfo routine only works with win95.

Now, i tried a sample code and it works wonderfull... And I'm a bit confused.

Please answer the question again and you will get the 200 points.

I send the question to the windows experts, too. And they recommend to use the ExtractIconEx routine :-) This routine isn't included in the delphi help, but is integrated in the shellapi unit.

Thanks

Marc
0
 
LVL 5

Accepted Solution

by:
JimBob091197 earned 200 total points
ID: 1357719
You can use ExtractIconEx, but you need the name of the file that has the icon, which must be EXE, DLL or ICO.  With ShGetFileInfo, you can pass it ANY file (e.g. DOC), and it will return the associated icon.
0

Featured Post

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

803 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question