tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルショートカットフォルダのアイコン取得
記事No8592
投稿日: 2009/01/16(Fri) 23:44
投稿者のぶ
いつもお世話になっております。

今、フォルダのショートカットに関連づけられているアイコンを取得したいのですが
エラーになってしまいます。

一応、フォルダアイコンは下記のパスを参考にして作っていたのですが・・・
>> http://support.microsoft.com/kb/319340/

環境は VB2008 WinXP で VB歴 1ヶ月ほどです。

ソースはこんな感じです。
Dim hImgSmall As IntPtr
Dim fName As String      'The file name to get the icon from.
Dim shinfo As SHFILEINFO
shinfo = New SHFILEINFO()

ListView1.SmallImageList = ImageList1
ListView1.LargeImageList = ImageList1

shinfo.szDisplayName = New String(Chr(0), 260)
shinfo.szTypeName = New String(Chr(0), 80)

fName = e.Node.FullPath & "\" & sName2.name

上記で リンク元とショートカットのフォルダ名を両方編集しましたが
うまくいきませんでした。

hImgSmall = SHGetFileInfo(fName, 0, shinfo, Marshal.SizeOf(shinfo),SHGFI_SMALLICON)
Dim myIcon As System.Drawing.Icon
myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon)

上記の shinfo.hIcon で Icon に渡された Win32 ハンドルが有効ではないか、
または型が正しくありません。 とエラーになってしまいます。
どう対処すればいいいのかわかりません。誰かご教授願います。

ImageList1.Images.Add(myIcon)
ListView1.Items.Add(fName, nIndex)

[ツリー表示へ]
タイトルRe: ショートカットフォルダのアイコン取得
記事No8593
投稿日: 2009/01/17(Sat) 00:53
投稿者オショウ
> 今、フォルダのショートカットに関連づけられているアイコンを取得したいのですが
> エラーになってしまいます。

  ショートカットと言うことは、xxxxx.LNKファイルのアイコンを取得したい
  と言うことですか?

  もしそうであれば、
  "All files (*.*)|*.*" の部分を
  "LNK files (*.LNK)|*.LNK"
  にしてみて下さい。

※ 違ったらすいません・・・

※ 因みに、Dim openFileDialog1 As OpenFileDialog を、
  Dim FolderBrowserDialog1 As FolderBrowserDialog に
  変更してフォルダのアイコンも正しく取れますネ!

以上。

以上。
 

[ツリー表示へ]
タイトルRe^2: ショートカットフォルダのアイコン取得
記事No8601
投稿日: 2009/01/17(Sat) 21:23
投稿者のぶ
オショウさん返信ありがとうございます。

説明が足りていませんでした。すいません。
今、エクスプローラを作成をつくっているのですが、Listviewにアイコンを表示したく作業
をしているところです。
フォルダとファイルに関連づいているアイコンを取得することができたのですが
フォルダのショートカットに関連ずいているアイコンを取得することができなく
悩んでいます。
エクスプローラなので、ダイアログは表示させたくないのです。。。

fName = e.Node.FullPath & "\" & sName2.name & "\"
'fName = LinkName & "\"

上記1行目がショートカットのディレクトリ
   2行目がリンク先のディレクトリになっています。

   2行目はうまくできたのですが、1行目だと同様のエラーになってしまいます。

hImgSmall = SHGetFileInfo(fName, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)

Dim myIcon As System.Drawing.Icon
myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon)

ImageList1.Images.Add(sName2.name, myIcon)
nIndex = nIndex + 1
item1.ImageKey = sName2.name
ListView1.Items.Add(item1)

うまく説明できなくてすいませんが、どうかご教授願いませんか?

[ツリー表示へ]
タイトルRe^3: ショートカットフォルダのアイコン取得
記事No8602
投稿日: 2009/01/17(Sat) 23:49
投稿者オショウ
> 説明が足りていませんでした。すいません。

  いや・・・
  取れるので、取れるようにプログラムを修正すればよい話。

  フォルダのショートカット(*.lnk)を、ファイルとして検索する
  際に・・・

  1. フォルダを検索
  2. *.lnkを検索
  3. 1.2.以外は一般ファイルとして検索

  でよいのでは?
  当然、通常のファイルもショートカット化できるので、それをどう
  見分けるか。と言うのもプログラマーの腕の出しどころ。

  そこを聞きたいと言うことですか?

以上。

[ツリー表示へ]
タイトルRe^4: ショートカットフォルダのアイコン取得
記事No8603
投稿日: 2009/01/18(Sun) 00:27
投稿者のぶ
オショウさんたびたび返信ありがとうございます。

>フォルダのショートカット(*.lnk)を、ファイルとして検索する
>  際に・・・

>  1. フォルダを検索
>  2. *.lnkを検索
>  3. 1.2.以外は一般ファイルとして検索

え〜と、すいませんうまくいえないのですが、
下記の1〜3の判別はできています。
ただ、下記の1〜3のアイコン取得をすべて同じロジックにすると
ショートカットに関連づけているアイコンだけ取得しようとすると
エラーになってしまいます。
この解決方法がわからないです・・・。

1. フォルダ         → アイコン取得OK
2. ショートカット      →  アイコン取得NG
3. 1.2以外の一般ファイル   → アイコン取得OK

説明がうまくできず申し訳ありません。

[ツリー表示へ]
タイトルRe^4: ショートカットフォルダのアイコン取得
記事No8604
投稿日: 2009/01/18(Sun) 00:49
投稿者のぶ
オショウさん。できました。

前回に返信してから、 .lnk というものが気になり、
ショートカットに関連されているアイコンを取得する
ファイル名の定義に & ".lnk" をつけたら取得することができました!

本当にありがとうございました。
windows上で .lnk の拡張子って表示されないんですね!?

[ツリー表示へ]
タイトルRe^2: ショートカットフォルダのアイコン取得
記事No8605
投稿日: 2009/01/18(Sun) 02:09
投稿者オショウ
>   ショートカットと言うことは、xxxxx.LNKファイルのアイコンを取得したい
>   と言うことですか?

  と、一番最初に書いていたので・・・

  はぁ〜よかったよかった・・・

以上。

[ツリー表示へ]
タイトルRe^3: ショートカットフォルダのアイコン取得
記事No8606
投稿日: 2009/01/19(Mon) 00:23
投稿者のぶ
オショウさん本当にありがとうございました。。。

・・・ちなみに、システムフォルダ?っていうんですかね?
お気に入りとかのフォルダなんですけど、そのアイコン取得も
同じ方法でできるんでしょうか?またエラーになってしまい、
拡張子とかあるのかなぁ?なんて調べたりしてるんですけど
検索に引っかかってくれず・・・。
何かしっていらっしゃったらご教授願います。

[ツリー表示へ]
タイトルRe^4: ショートカットフォルダのアイコン取得
記事No8607
投稿日: 2009/01/19(Mon) 08:28
投稿者オショウ
> ・・・ちなみに、システムフォルダ?っていうんですかね?

  どんなコードを書いておられるのか・・・
  ちゃんと取れますヨ!

  フォルダのパス、どうやって取得しているのでしょうか?

  http://dobon.net/vb/dotnet/file/getfolderpath.html

  ご参考まで・・・

以上。

[ツリー表示へ]
タイトルRe^5: ショートカットフォルダのアイコン取得
記事No8609
投稿日: 2009/01/19(Mon) 22:53
投稿者のぶ
オショウさんたびたびありがとうございます。

はじめはわからなかったので
file = C:\Documents and Settings\userName\お気に入り
でうまくアイコン表示されず
file = C:\Documents and Settings\atushi\Favorites
でもできず
オショウさんのをみて
file = System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites)

にしたらうまくアイコンを取得することができました。
ありがとうございます。

ちなみに、C:\Documents and Settings\userName\お気に入りが
システムフォルダだったら、
System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
を編集するみたいなロジックにしたいのですが、設定したフォルダ名が
システムフォルダか?の判別をつけることは可能でしょうか?

検索はしたのですが、ひっかからず・・・
たびたびすいませんが、しっていたらご教授願います。

[ツリー表示へ]
タイトルRe^6: ショートカットフォルダのアイコン取得
記事No8610
投稿日: 2009/01/20(Tue) 08:25
投稿者オショウ
> ちなみに、C:\Documents and Settings\userName\お気に入りが
> システムフォルダだったら、
> System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
> を編集するみたいなロジックにしたいのですが、設定したフォルダ名が
> システムフォルダか?の判別をつけることは可能でしょうか?

  言われている意味がよく解らないので・・・

  まずは、こちら
  http://dobon.net/vb/dotnet/file/getfolderpath.html

  特殊フォルダのパスの取得方法をご参照下さい。

※ FolderBrowserDialog で取得したパスで問題なくフォルダのアイコン
  取れるはずですが。
  OSがVistaなら、管理者権限が無いと取れないフォルダはありますが。

以上。

[ツリー表示へ]
タイトルRe^7: ショートカットフォルダのアイコン取得
記事No8611
投稿日: 2009/01/20(Tue) 22:50
投稿者のぶ
オショウさん、何度も丁寧にすいません。

なかなかうまく説明できず…。
今、指定したフォルダのサブフォルダのアイコンを取得できるものをつくってます。
サブフォルダは shell.application で取得を実施しています。

下記は C:\Documents and Settings\userName\ 配下のサブフォルダを取得しようとしてます。
取得するとこのようなサブフォルダ名で取得されます。

  My Documents
  UserData
  WINDOWS
  デスクトップ  
  お気に入り

この時に、C:\Documents and Settings\userName\お気に入り\ の際にアイコンの
取得ができないのです。

なので、
If InStr(sName2.name, "お気に入り") > 0 Then
    fName = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Favorites)
End If
を入れて仮対処はしているのですが・・・。
なんとか、お気に入りだったらという条件をシステムフォルダだったらの条件にして
System.Environment.SpecialFolder.Favorites を編集できるようにしたいんです。

objShell2 = CreateObject("Shell.Application")
fol2 = objShell2.NameSpace("C:\Documents and Settings\userName\")
fc2 = fol2.Items()

Dim hImgSmall As IntPtr  
Dim fName As String
Dim shinfo As SHFILEINFO
shinfo = New SHFILEINFO()

For Each sName2 In fc2
     aaa = sName2.Name
     fName = e.Node.FullPath & "\" & sName2.name & "\"

     If InStr(sName2.name, "お気に入り") > 0 Then
        fName = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Favorites)
     End If

     '--- アイコンの取得・表示
     ListView1.SmallImageList = ImageList1
     ListView1.LargeImageList = ImageList1

     shinfo.szDisplayName = New String(Chr(0), 260)
     shinfo.szTypeName = New String(Chr(0), 80)
     hImgSmall = SHGetFileInfo(fName, 0, shinfo, Marshal.SizeOf(shinfo), _
   SHGFI_ICON Or SHGFI_SMALLICON Or SHGFI_SYSICONINDEX)
     Dim myIcon As System.Drawing.Icon
     myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon)
     ImageList1.Images.Add(sName2.name, myIcon)
     nIndex = nIndex + 1
     item1.ImageKey = sName2.name
     ListView1.Items.Add(item1)

Next

長くなってしまい、大変申し訳ありません。
何か、なおしたほうが良い点がありましたらご教授願います。

[ツリー表示へ]
タイトルRe^8: ショートカットフォルダのアイコン取得
記事No8612
投稿日: 2009/01/21(Wed) 00:52
投稿者オショウ
ようやく解りました・・・
リダイレクトフォルダ
ですね〜

リダイレクトフォルダ名の絶対パス変換は・・・
解りません。

ちょっと調べてみたんですが、発見できず・・・

あくまで参考情報として
http://www.windows-world.jp/ms_support/-/113690.html

※ 因みに、何故『shell.application』使っているんですか?
  .NET使っているなら、.NETのクラスにいろいろありますが。

以上。

[ツリー表示へ]
タイトル直接パスを指定しても取得できますが。
記事No8613
投稿日: 2009/01/22(Thu) 13:10
投稿者花ちゃん
> はじめはわからなかったので
> file = C:\Documents and Settings\userName\お気に入り
> でうまくアイコン表示されず
> file = C:\Documents and Settings\atushi\Favorites
> でもできず

Ret = SHGetFileInfo("C:\Documents and Settings\UserName\Favorites", 0, Psfi, _
                                       Marshal.SizeOf(Psfi), L_ICON_OP)

Ret = SHGetFileInfo("C:\Documents and Settings\All Users\Favorites", 0, Psfi, _
                                       Marshal.SizeOf(Psfi), L_ICON_OP)

どちらでも直接指定で問題なく取得できますが。
VB2008 WinXP  で確認

エラーがでるフォルダの正確なPATH とフォルダの属性 及びエラーメッセージを投稿
して見て下さい。
(コピー & ペーストで正確なコードを投稿して下さい)

[ツリー表示へ]
タイトルRe: 直接パスを指定しても取得できますが。
記事No8636
投稿日: 2009/01/26(Mon) 12:55
投稿者のぶ
返信が遅れてすいません。
家のPCが壊れてしまい…。

オショウさん返信ありがとうございます。
shell.application を使ったのは処理が速いというのがあったので
使いました。

花ちゃんさん返信ありがとうございます。
> > file = C:\Documents and Settings\atushi\Favorites
…できました。 自分の勘違いだったみたいです。

オショウさん・花ちゃんさん大変ありがとうございました。
少し工夫してやってみます。

すいません。漫喫で返信させてもれってます。

[ツリー表示へ]