ExtractIconでアイコンの数を取得するには?

解決


senzin  2005-02-02 06:29:22  No: 12991

APIについて質問させて下さい。
実行ファイル等からアイコンを取得する必要があり、調べた結果ExtractIconで取得する事はできたのですが、ファイルの持っているアイコン数を調べるのに引数の三番目に-1を入れればいいと、ヘルプにもAPIのリファレンスにも書いてあるのに、それで実行すると範囲外の定数式ですとエラーが出ます。
なぜでしょう?
OSは98とXP、Delphi5 Pro です。


ふぐちゃん  2005-02-02 06:57:04  No: 12992

ExtractIconの3番目の引数はUINTです。(LongWordと同じ)
-1をUINTにキャストすれば正常に働くはずですよ。

var
  IconNum: Integer;
begin
  IconNum := ExtractIcon(Handle, PChar(FileName), UINT(-1));


大豆Z  2005-02-02 09:16:05  No: 12993

メモリのバグなかった?
うんうん

http://forum.nifty.com/fdelphi/faq/00111.htm


大豆Z  2005-02-02 10:21:14  No: 12994

小さいアイコンも取り出すのなら
ExtractIconEx
です
  パラメーターが違うので解説を読んだ方がいいです。

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/icons/iconreference/iconfunctions/extracticonex.asp
http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm

XPは大丈夫でしょうけど
数をもらうときのメモリ関係のがどこのバージョンまでひきずっているかは、
しらべていないのでわかりません。
Win98ってのが微妙。

8年くらいまえに書いたコード削りました
参考にどうぞ

uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
  var  IconHandle : HIcon;
       TmpIcon : TIcon;
       i : integer;
begin
    i := 0;
    IconHandle := ExtractIcon(Application.Handle,PChar(FileName) , i);
    while (IconHandle>1) do
     // 0ない。  1ファイル形式が違う
    begin
      inc(i);
      TmpIcon := TIcon.Create;
      try
        TmpIcon.Handle := IconHandle;
        { 処理 }
      //  Image1.Picture.Icon.Assign(TmpIcon);
      finally
        TmpIcon.Free;
      end;
      IconHandle := ExtractIcon(Application.Handle,PChar(FileName) , i);
    end;

//  Caption := IntToStr(i);  // アイコン数
end;


16ビット  2005-02-02 19:43:17  No: 12995

>メモリのバグなかった?
>うんうん
>http://forum.nifty.com/fdelphi/faq/00111.htm
これWin16のExtractIconのことでは?


senzin  2005-02-04 05:01:16  No: 12996

ふぐちゃんさん、大豆Zさん、16ビットさんレスありがとうございます。

無事UINTにキャストする事で動作する様になりました。
大豆Zさんのコードも勉強になりました。ファイル形式はこうやって調べるんですね。
ただ、一つ疑問なんですが、戻り値が1の時ファイル形式が違うとありますが、(APIのリファレンスにもそうありました)exeファイルに含まれるアイコン数が1つの場合はどうなるのでしょうか?
初歩的な質問かもしれませんが、お教え頂けないでしょうか。


大豆Z  2005-02-04 06:39:27  No: 12997

>exeファイルに含まれるアイコン数が1つの場合はどうなるのでしょうか?
ハンドルとアイコン数を混同しているようだから
HICON ExtractIcon(hInst, lpszExeName, nIconIndex)
のnIconIndex  の説明もう一度読むといいよ。


senzin  2005-02-05 06:08:02  No: 12998

>nIconIndex  の説明もう一度読むといいよ。
もう一度読んでみました。私の持っているAPIリファレンスにはこう書いてありました。
(nIconIndex)
アイコンのインデックスを指定します。例えば、0を指定すると、ファイルの最初
のハンドルが返ります。
-1を指定すると、ファイルが持つアイコンの総数が返ります。

戻り値の説明でも-1を指定した時はアイコンの総数が返るとあります。
もしかしてこのアイコンの総数とはアイコンの個数の事ではないのでしょうか。
なんだかよく分からなくなってきました。


大豆Z  2005-02-05 09:02:05  No: 12999

> Jphelp\API32WH.HLP
> Microsoft  Win32 API プログラマーズ リファレンス  より引用
> nIconIndex
>   取得するアイコンのインデックスを指定します。
>   このパラメータが0のときは、 関数は指定されたファイルの最初のアイコンのハンドルを返します。
>   このパラメータが−1のときは、 指定されたファイルにあるアイコンの総数を返します。

> 戻り値
>   関数が正常に終了した場合は、 アイコンのハンドルを返します。
>   ファイルが実行可能ファイル、 ダイナミック リンク ライブラリ、 またはアイコン ファイルの
>   いずれでもない場合は、 1を返します。
>   ファイル内にアイコンが見つからなかった場合は、 NULLを返します。
>


大豆Z  2005-02-05 09:07:40  No: 13000

要するに
 nIconIndex  =−1  で呼び出したら
  戻り値は、アイコンの個数

 nIconIndex  >=0  で呼び出したら
  戻り値は、0(null),1,またはアイコンのハンドル


senzin  2005-02-06 01:24:08  No: 13001

思いっきり勘違いしていたようです。
大豆Zさんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加