APIについて質問させて下さい。
実行ファイル等からアイコンを取得する必要があり、調べた結果ExtractIconで取得する事はできたのですが、ファイルの持っているアイコン数を調べるのに引数の三番目に-1を入れればいいと、ヘルプにもAPIのリファレンスにも書いてあるのに、それで実行すると範囲外の定数式ですとエラーが出ます。
なぜでしょう?
OSは98とXP、Delphi5 Pro です。
ExtractIconの3番目の引数はUINTです。(LongWordと同じ)
-1をUINTにキャストすれば正常に働くはずですよ。
var
IconNum: Integer;
begin
IconNum := ExtractIcon(Handle, PChar(FileName), UINT(-1));
メモリのバグなかった?
うんうん
http://forum.nifty.com/fdelphi/faq/00111.htm
小さいアイコンも取り出すのなら
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;
>メモリのバグなかった?
>うんうん
>http://forum.nifty.com/fdelphi/faq/00111.htm
これWin16のExtractIconのことでは?
ふぐちゃんさん、大豆Zさん、16ビットさんレスありがとうございます。
無事UINTにキャストする事で動作する様になりました。
大豆Zさんのコードも勉強になりました。ファイル形式はこうやって調べるんですね。
ただ、一つ疑問なんですが、戻り値が1の時ファイル形式が違うとありますが、(APIのリファレンスにもそうありました)exeファイルに含まれるアイコン数が1つの場合はどうなるのでしょうか?
初歩的な質問かもしれませんが、お教え頂けないでしょうか。
>exeファイルに含まれるアイコン数が1つの場合はどうなるのでしょうか?
ハンドルとアイコン数を混同しているようだから
HICON ExtractIcon(hInst, lpszExeName, nIconIndex)
のnIconIndex の説明もう一度読むといいよ。
>nIconIndex の説明もう一度読むといいよ。
もう一度読んでみました。私の持っているAPIリファレンスにはこう書いてありました。
(nIconIndex)
アイコンのインデックスを指定します。例えば、0を指定すると、ファイルの最初
のハンドルが返ります。
-1を指定すると、ファイルが持つアイコンの総数が返ります。
戻り値の説明でも-1を指定した時はアイコンの総数が返るとあります。
もしかしてこのアイコンの総数とはアイコンの個数の事ではないのでしょうか。
なんだかよく分からなくなってきました。
> Jphelp\API32WH.HLP
> Microsoft Win32 API プログラマーズ リファレンス より引用
> nIconIndex
> 取得するアイコンのインデックスを指定します。
> このパラメータが0のときは、 関数は指定されたファイルの最初のアイコンのハンドルを返します。
> このパラメータが−1のときは、 指定されたファイルにあるアイコンの総数を返します。
>
> 戻り値
> 関数が正常に終了した場合は、 アイコンのハンドルを返します。
> ファイルが実行可能ファイル、 ダイナミック リンク ライブラリ、 またはアイコン ファイルの
> いずれでもない場合は、 1を返します。
> ファイル内にアイコンが見つからなかった場合は、 NULLを返します。
>
要するに
nIconIndex =−1 で呼び出したら
戻り値は、アイコンの個数
nIconIndex >=0 で呼び出したら
戻り値は、0(null),1,またはアイコンのハンドル
思いっきり勘違いしていたようです。
大豆Zさんありがとうございました。
ツイート | ![]() |