PCのフォルダツリーを作成するには?

解決


Franz  2007-10-02 21:16:11  No: 143938

VB2005、XPで作成しています。
PC内のフォルダツリーを作成しています。
デスクトップがルートノードになるようにしようとしています。
このときですが、

マイコンピュータ
マイドキュメント
マイネットワーク
ごみ箱

がノードとして作成されません。

TreeView1.Nodes.Add(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop))

により取得したフォルダ直下にはないので作成されないのは当然ですが、
作成する方法として何か良い方法があれば教えてください。よろしくお願いします。


魔界の仮面弁士  2007-10-02 21:56:38  No: 143939

正攻法でやるとなると、API を使うしかないです。それなりに面倒ですよ。

とりあえず、下記に C# 製の ExplorerTreeView のサンプルがあります。
イベントが無いなど、細かい点は未実装ですが、処理のイメージは掴めるかと。
http://www.codeproject.com/cs/miscctrl/ExplorerTreeView.asp


Franz  2007-10-05 22:07:04  No: 143940

魔界の仮面弁士さんありがとうございます。
C#製のサンプル、大変参考になります。
ただ、難しいですね(^^;。
その後もいろいろと他のサンプルを見ていますが、つまっています。

SHGetSpecialFolderLocation(Me.Handle, CSIDL_DESKTOP, pid)
でポインタを取得し、
SHGetFileInfo(pid, 0, SHFI, Marshal.SizeOf(SHFI), SHGFI_DISPLAYNAME Or SHGFI_ICON)
で情報を取得しようとしていますが、
ポインタは取得するものの、情報は取得できません。
なぜでしょうか??


魔界の仮面弁士  2007-10-05 22:47:22  No: 143941

名前だけが得られれば良いのなら、
  Shell オブジェクトの NameSpace メソッド
  http://msdn2.microsoft.com/en-us/library/ms630423.aspx
から Folder オブジェクトを得て、FolderItem を列挙する手法もあります。
(COM オブジェクトなので Marshal.RelaseComObject を忘れずに)

> ポインタは取得するものの、情報は取得できません。
> なぜでしょうか??
情報が断片的なので、これだけだと判断しにくいです。

取得部分までのコードを単純化して、第三者がすぐに試せるような
コードにして提示できますでしょうか?


Franz  2007-10-06 06:18:49  No: 143942

魔界の仮面弁士さんまたまたありがとうございます。
C#製のサンプルがまさに作成したいものでありますので名前だけでは困ります(^^;。

http://www.atmarkit.co.jp/fdotnet/dotnettips/280getappicon/getappicon.html
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200408/04080055.txt

この2つのコードを参考にしています。
そんな状況での下記のコードになります。

Dim SHFI As New SHFILEINFO()
Dim pid As IntPtr
ret = SHGetSpecialFolderLocation(Me.Handle, CSIDL_DESKTOP, pid)
ret = SHGetFileInfo(pid, 0, SHFI, Marshal.SizeOf(SHFI), SHGFI_DISPLAYNAME Or SHGFI_ICON)

いかがでしょうか??


魔界の仮面弁士  2007-10-09 02:04:33  No: 143943

> いかがでしょうか??
正直なところ、これでもまだ、情報が断片的すぎます。

API 宣言も無ければ、戻り値や Err.LastDllError の結果も記載されていませんし、
「情報は取得できません」という状況の具体的な様子も説明が無いですよね。

正しく記述すれば、正しく取得されるであって、それが上手くいかない場合、
まずはコードを疑わねばならないのですが……提示されたコードでは、
>>> 第三者がすぐに試せるような
の状態になっていませんので、判断に困ります。

> なぜでしょうか??
> いかがでしょうか??
うまくいかなり理由が必要についての説明が必要なのであれば、
ByVal/ByRef の間違い、型指定のミス、属性指定の漏れなども含めて
確認が必要なので、「動作させられるコード」を提示してください。m(_ _)m

とりあえず、提示されたコードだけで言えば……

・API 宣言/構造体宣言などは適切か?
(たとえば、関数側が W タイプで、構造体側が A タイプだったりはしないか?)

> ret = SHGetSpecialFolderLocation(Me.Handle, CSIDL_DESKTOP, pid)
・これは成功しているのか? (正常時は 0 を返すはず)

> ret = SHGetFileInfo(pid, 0, SHFI, Marshal.SizeOf(SHFI), SHGFI_DISPLAYNAME Or SHGFI_ICON)
・Marshal.SizeOf は、正しい値を返しているのか?
(SHFILEINFOA なら 352、SHFILEINFOW なら 692  になるはず)


魔界の仮面弁士  2007-10-09 02:13:19  No: 143944

# あぁ、回答が微妙に変な日本語になってる。。。まぁいいか。

VB2005 での実装の参考になるかどうかわかりませんが、
VB6 版のサンプルを載せておきます。

http://btmtz.mvps.org/index.html
見るべきは、[VBExplorer] や [VBTreeView]のあたり。


Franz  2007-10-22 18:27:19  No: 143945

魔界の仮面弁士さん
いろいろとアドバイスありがとうございます。
なんとか自分で作成することができました(^^)。
C#製のサンプル、ほんとうに助かりました。
また投稿すると思いますが、今後ともよろしくお願いいたしますm(__)m。


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

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






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