AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>dll,exeからアイコンを取得する
Delphi Tips
Delphi Win32API
ダウンロード

Counter

Delphi Tips & Tricks

dll,exeからアイコンを取得する

 実行ファイルやDLLにはいくつものアイコンが埋め込まれています。
ファイル名からそのアイコンのハンドルを取得する方法です。
 またそのファイルに含まれているアイコン数を取得することもできます。
uses
  SHELAPI;
---------------------------------------------------
procedure Tform1.Button1Click(sender :TObject);
var
 HICO :HICON;//アイコンハンドル
 count, i :integer;
 x, y :integer;//アイコン描画座標の計算用
begin
 //ファイルに含まれているアイコン数を取得
 count :=ExtractIcon(hInstance, PChar('C:\WINDOWS\explorer.exe'), DWORD(-1));
  for  i :=0 to count-1 do
  begin
    x :=i mod 5;//座標計算
    y :=i div 5;
    //アイコンハンドル取得
    HICO :=ExtractIcon(hInstance, PChar('C:\WINDOWS\explorer.exe'), i);
    //計算した座標にアイコンを描画
    DrawIcon(Canvas.Handle, 5+37*x, 5+37*y, HICO);
  end;
  //アイコンハンドルを解放
  DestroyIcon(HICO);
end; 

 アイコンを取得するにはExtractIcon関数、描画するにはDrawIcon関数またはDrawIconEX関数を使います。他にも取得する方法はあるのですがこれらが一番簡単です。
HICON ExtractIcon(
HINSTANCE
hInst, // インスタンスのハンドル
LPCTSTR lpszExeFileName, // ファイル名
UINT nIconIndex // アイコンのインデックス番号 );
 〜MSDNより抜粋〜
 
 まず第1引数hinstはDelphiのグローバル変数であるhInstanceを指定し、第2変数はアイコンを取得またはアイコン数を取得したいファイル名をPChar()で型キャストして指定します。第3引数はアイコンを取得したい場合は0から始まる整数(0..n)を指定します。普段実行ファイルで表示されているアイコンのインデックスは普通は0になっています。関数が成功するとアイコンハンドルが戻り値にセットされます。失敗するとその原因により0または1が返ります。
 アイコンの総数を取得したい場合は第3引数に-1をCardinal(Cardinal=DWORD)に型キャストして渡すと、戻り値にアイコンの総数がセットされます。
 このハンドルを使ってDrawIcon関数で描画しています。DrawIcon関数は第1引数に描画したいキャンバスのハンドル(HDC)、第2引数にX座標、第3引数にY座標、最後に描画したいアイコンハンドルを指定します。任意のサイズや背景ブラシの色、描画モードを詳しく指定したい場合はDrawIconEX関数を使うといいでしょう。
BOOL DrawIcon(
HDC
hDC, // デバイスコンテキストのハンドル
int X, // 左上隅の x 座標
int
Y, // 左上隅の y 座標
HICON
hIcon // アイコンのハンドル );
BOOL DrawIconEx(
HDC
hdc, // デバイスコンテキストのハンドル
int xLeft, // 左上隅の x 座標
int yTop, // 左上隅の y 座標
HICON
hIcon, // アイコンのハンドル
int
cxWidth, // アイコンの幅
int
cyWidth, // アイコンの高さ
UINT
istepIfAniCur, // アニメーションカーソルの場合、 // フレームのインデックス番号
HBRUSH
hbrFlickerFreeDraw, // バックグラウンドブラシのハンドル
UINT
diFlags // アイコン描画フラグ ); 
 〜MSDNより抜粋〜
このサンプルでは最初にアイコン数を取得し、アイコン数だけ横5列になるように座標計算してからフォームに描画しています。
最後にDestroyIcon()で解放するのを忘れないようにしましょう。

1