- - * - WhiteUnicorn - * - -




* #WhiteUnicorn/ StartPage/ Documentation/DelphiFAQ >


Frequently Asked Questions

Extracting Icons

Question:

How can I use the undocumented ShellAPI function ExtractIconEx() to extract the small and large icons from a given file?

Answer:

You can use the undocumented ShellAPI function ExtractIconEx() to

extract both large and small icons from an executable file,

dynamic-link library (DLL), or icon file.



The function is prototyped as:



function ExtractIconEx(lpszFile: PAnsiChar;

                       nIconIndex: Integer;

                       phiconLarge : PhIconArray;

                       phiconSmall: PhIconArray;

                       nIcons: UINT): UINT; stdcall;





Parameters



lpszFile:

 Pointer to a null-terminated string specifying the name of the

executable, DLL, or icon file to extract the icon from.



nIconIndex:

 Specifies the index of the icon to retrieve. If this value is 0, the

function returns the handle of the first icon in the specified file.

If the value is -1 and phiconLarge and phiconSmall are both nil, the

function returns the total number of icons in the executable, DLL, or

icon file to extract the icon from. If the file is an executable or

DLL file, the return value is the number of RT_GROUP_ICON resources.

If the file is an .ICO file, the return value is 1.



phiconLarge:

 Pointer to an array of icon handles for the large icons returned.

This parameter can be nil if only one icon is to be extracted.



phiconSmall

 Pointer to an array of icon handles for the small icons returned.

This parameter can be nil if only one icon is to be extracted.



nIcons

 Specifies the number of icons to extract.



Return Value



The return value is the handle to an icon if only one icon is to be

extracted. If there were no icons found in the file, the return value

is 0.



The following example demonstrates using the ExtractIconEx() function.

Note that the functions are prototyped differently than as prototyped

in the ShellAPI unit, to allow the full usage of the function.



type ThIconArray = array[0..0] of hIcon;

type PhIconArray = ^ThIconArray;



function ExtractIconExA(lpszFile: PAnsiChar;

                        nIconIndex: Integer;

                        phiconLarge : PhIconArray;

                        phiconSmall: PhIconArray;

                        nIcons: UINT): UINT; stdcall;

  external 'shell32.dll' name 'ExtractIconExA';





function ExtractIconExW(lpszFile: PWideChar;

                        nIconIndex: Integer;

                        phiconLarge: PhIconArray;

                        phiconSmall: PhIconArray;

                        nIcons: UINT): UINT; stdcall;

  external 'shell32.dll' name 'ExtractIconExW';



function ExtractIconEx(lpszFile: PAnsiChar;

                       nIconIndex: Integer;

                       phiconLarge : PhIconArray;

                       phiconSmall: PhIconArray;

                       nIcons: UINT): UINT; stdcall;

  external 'shell32.dll' name 'ExtractIconExA';





procedure TForm1.Button1Click(Sender: TObject);

var

    NumIcons : integer;

    pTheLargeIcons : phIconArray;

    pTheSmallIcons : phIconArray;

    LargeIconWidth : integer;

    SmallIconWidth : integer;

    SmallIconHeight : integer;

    i : integer;

    TheIcon : TIcon;

    TheBitmap : TBitmap;

begin

  NumIcons :=

  ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe',

                -1,

                nil,

                nil,

                0);

  if NumIcons > 0 then begin

    LargeIconWidth := GetSystemMetrics(SM_CXICON);

    SmallIconWidth := GetSystemMetrics(SM_CXSMICON);

    SmallIconHeight := GetSystemMetrics(SM_CYSMICON);

    GetMem(pTheLargeIcons, NumIcons * sizeof(hIcon));

    GetMem(pTheSmallIcons, NumIcons * sizeof(hIcon));

    FillChar(pTheLargeIcons^, NumIcons * sizeof(hIcon), #0);

    FillChar(pTheSmallIcons^, NumIcons * sizeof(hIcon), #0);

   ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe',

                  0,

                  pTheLargeIcons,

                  pTheSmallIcons,

                  numIcons);

   {$IFOPT R+}

     {$DEFINE CKRANGE}

     {$R-}

   {$ENDIF}

    for i := 0 to (NumIcons - 1) do begin

      DrawIcon(Form1.Canvas.Handle,

               i * LargeIconWidth,

               0,

               pTheLargeIcons^[i]);

      TheIcon := TIcon. Create;

      TheBitmap := TBitmap.Create;

      TheIcon.Handle := pTheSmallIcons^[i];

      TheBitmap.Width := TheIcon.Width;

      TheBitmap.Height := TheIcon.Height;

      TheBitmap.Canvas.Draw(0, 0, TheIcon);

      TheIcon.Free;

      Form1.Canvas.StretchDraw(Rect(i * SmallIconWidth,

                                    100,

                                    (i + 1) * SmallIconWidth,

                                    100 + SmallIconHeight),

                               TheBitmap);

      TheBitmap.Free;

    end;

   {$IFDEF CKRANGE}

     {$UNDEF CKRANGE}

     {$R+}

   {$ENDIF}

    FreeMem(pTheLargeIcons, NumIcons * sizeof(hIcon));

    FreeMem(pTheSmallIcons, NumIcons * sizeof(hIcon));

  end;

end;



end.






* #WhiteUnicorn/ StartPage/ Documentation/DelphiFAQ >



- - * - Anastasija aka WhiteUnicorn - * - - LJLiveJournal
PFPhotoFile