C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: SHGetFileInfoとDestroyIcon


(過去ログ 14 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■4856 / inTopicNo.1)  SHGetFileInfoとDestroyIcon
  
□投稿者/ 倉田 有大 (30回)-(2007/06/27(Wed) 18:46:13)

分類:[C# (Windows)] 

SHGetFileInfoでICONを取得した場合かならず、Destroyアイコンで破棄しないといけないのでしょうか?


SHFILEINFO shfi = new SHFILEINFO();
IntPtr hSystemImageList = IntPtr.Zero;
hSystemImageList = WindowsAPI.SHGetFileInfo(@"c:\", 0, out shfi, Marshal.SizeOf(typeof(SHFILEINFO)),
ShellFileInfoFlags.SHGFI_SYSICONINDEX | ShellFileInfoFlags.SHGFI_SMALLICON);
int z = WindowsAPI.SendMessage(this.Handle, 0x1003, 0x0001, (int)hSystemImageList);

こんな感じにリストビューとアイコンを結びつけた後、

SHFILEINFO shfi = new SHFILEINFO();
lvItem.mask = ListViewItemFlags.LVIF_IMAGE;
IntPtr z = WindowsAPI.SHGetFileInfo(filePath, 0, out shfi, Marshal.SizeOf(typeof(SHFILEINFO)),
ShellFileInfoFlags.SHGFI_SYSICONINDEX | ShellFileInfoFlags.SHGFI_SMALLICON | ShellFileInfoFlags.SHGFI_LARGEICON);
lvItem.iImage = shfi.iIcon;
int z2 = WindowsAPI.SendMessage(this.Handle, ListViewMessages.LVM_SETITEM,0,ref lvItem);

こんな感じに、リストビューのアイテムにアイコンを結び付けているのですが、
この後、

TTFA.Win32.WindowsAPI.DestroyIcon(shfi.hIcon);

このように、DestroyIconを呼ぶ必要はあるのでしょうか?
ぐぐってみても、破壊しないといけないやら、破壊してはいけないやらで、意見がわかれて、どっち?と混乱しています。


引用返信 編集キー/
■4869 / inTopicNo.2)  Re[1]: SHGetFileInfoとDestroyIcon
□投稿者/ とっちゃん (154回)-(2007/06/27(Wed) 21:49:57)
とっちゃん さんの Web サイト
No4856 (倉田 有大 さん) に返信
> SHGetFileInfoでICONを取得した場合かならず、Destroyアイコンで破棄しないといけないのでしょうか?
>
「アイコン」を取得した場合はDestoryIconは必要です。

「が」

「アイコンインデックス」を取得した場合は必要ありません。


>
> SHFILEINFO shfi = new SHFILEINFO();
> IntPtr hSystemImageList = IntPtr.Zero;
> hSystemImageList = WindowsAPI.SHGetFileInfo(@"c:\", 0, out shfi, Marshal.SizeOf(typeof(SHFILEINFO)),
> ShellFileInfoFlags.SHGFI_SYSICONINDEX | ShellFileInfoFlags.SHGFI_SMALLICON);
> int z = WindowsAPI.SendMessage(this.Handle, 0x1003, 0x0001, (int)hSystemImageList);
>
> こんな感じにリストビューとアイコンを結びつけた後、
>
> SHFILEINFO shfi = new SHFILEINFO();
> lvItem.mask = ListViewItemFlags.LVIF_IMAGE;
> IntPtr z = WindowsAPI.SHGetFileInfo(filePath, 0, out shfi, Marshal.SizeOf(typeof(SHFILEINFO)),
> ShellFileInfoFlags.SHGFI_SYSICONINDEX | ShellFileInfoFlags.SHGFI_SMALLICON | ShellFileInfoFlags.SHGFI_LARGEICON);
> lvItem.iImage = shfi.iIcon;
> int z2 = WindowsAPI.SendMessage(this.Handle, ListViewMessages.LVM_SETITEM,0,ref lvItem);
>
> こんな感じに、リストビューのアイテムにアイコンを結び付けているのですが、

で、こちらですが、「アイコンインデックス」を取得していますので、「アイコンハンドル」はセットされません。
デバッグすればわかることですが、NULL(0)になってますよ。

なので、解放は必要ありません(まぁ例外は出ませんけど、エラーは出てると...w)。

で、それとは別件ですが、思いっきりバグっています。
ShellFileInfoFlags.SHGFI_LARGEICON はいりません。
最初にイメージリストを取得するときと同じフラグでOKですし、SMALL/LARGE は排他扱いになりますので、必ずどちらかだけしかつけてはいけないことになっています。

別途 LARGEICON のイメージリストが必要ならそれはそれで作成してください。
ListViewにもスモールとラージでは別々に設定が必要ですよ。


ところで、なぜに、SendMessage?
ここまでするのなら、C++/CLIのほうがコードがすっきりすると思うんですが?
#この先に待っているであろうことも想定するとそろそろC#はあきらめたほうが良い気がしますw


引用返信 編集キー/
■4874 / inTopicNo.3)  Re[2]: SHGetFileInfoとDestroyIcon
□投稿者/ 倉田 有大 (32回)-(2007/06/27(Wed) 22:14:30)
> なので、解放は必要ありません(まぁ例外は出ませんけど、エラーは出てると...w)。

必要ないのですね、すっきりしました。ありがとうございます。

> で、それとは別件ですが、思いっきりバグっています。
> ShellFileInfoFlags.SHGFI_LARGEICON はいりません。
> 最初にイメージリストを取得するときと同じフラグでOKですし、SMALL/LARGE は排他扱いになりますので、必ずどちらかだけしかつけてはいけないことになっています。
>
> 別途 LARGEICON のイメージリストが必要ならそれはそれで作成してください。
> ListViewにもスモールとラージでは別々に設定が必要ですよ。

ありがとうございます。
まったく気づきませんでした。
さっそく、ソースを修正しました。<__>

> ところで、なぜに、SendMessage?
> ここまでするのなら、C++/CLIのほうがコードがすっきりすると思うんですが?
> #この先に待っているであろうことも想定するとそろそろC#はあきらめたほうが良い気がしますw

いやー、たぶん昔CodeProjectかどこかのソースのお手本そのままにしてるとおもいます^^;
SendMessage以外の方法があるのでしょうか?
ぐぐって、C++の方法なら発見したのですが。
http://homepage1.nifty.com/Roy_/Software/WTL/WTL_Lecture06.htm
引用返信 編集キー/
■4885 / inTopicNo.4)  Re[3]: SHGetFileInfoとDestroyIcon
□投稿者/ とっちゃん (156回)-(2007/06/27(Wed) 22:56:49)
とっちゃん さんの Web サイト
No4874 (倉田 有大 さん) に返信
>
> いやー、たぶん昔CodeProjectかどこかのソースのお手本そのままにしてるとおもいます^^;
> SendMessage以外の方法があるのでしょうか?

リストビューは System.Windows.Forms.ListView コントロールを使っているのですよね?

であれば、ListView クラスのプロパティやメソッドを使っていろいろできると思うのですが?

APIを(P/Invokeなどで)使わなければ解決できない場合も少なからずありますが
Managed な世界で解決できることはManagedな世界で完結するように書くように
常日頃心がけることをお勧めします。

引用返信 編集キー/
■4901 / inTopicNo.5)  Re[4]: SHGetFileInfoとDestroyIcon
□投稿者/ 倉田 有大 (38回)-(2007/06/28(Thu) 11:01:00)
> リストビューは System.Windows.Forms.ListView コントロールを使っているのですよね?
>
> であれば、ListView クラスのプロパティやメソッドを使っていろいろできると思うのですが?

それで行おうとおもったのですが、エクスプローラーライクにアイコンを割り当てようとすると、
アンマネージド使う方法しか検索できなかったのです。

> APIを(P/Invokeなどで)使わなければ解決できない場合も少なからずありますが
> Managed な世界で解決できることはManagedな世界で完結するように書くように
> 常日頃心がけることをお勧めします。

C#ですから、Managed で全部つくりたかったです。
しかし、SusiePluginとかにも対応しているエクスプローラーライクのアプリなので、全部Managed で作るほうが
難しかったですT^T
実作SusiePluginも直接Managed から呼び出さず、間にSusiePlugin.DLLという、C#から読み出しやすいDLLを作って、
間接的に読み出しています。

出来ることなら、全部Managedで行いたかったですねT^Tそんな技量がないです

こんかいは、皆様お付き合いくださいましてありがとうございました。<__>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -