ネットワーク全体について – プログラミング – Home

ネットワーク全体について
 
通知
すべてクリア

ネットワーク全体について


Gon
 Gon
(@Gon)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

現在、ダイアログによるCTreeCtrlを使用したフォルダの列挙
(エクスプローラーのような形)を目指しています。

デスクトップをルートとしており、ローカルのドライブ
については検出が出来たのですが、ネットワークの検出が
上手く行きません。
Win2000の環境なのですが、マイネットワークの検出と
「ネットワークプレースの追加」、ネットワーク上の
フォルダへのショートカットの検出は上手く行きます。

しかし、ネットワーク全体だけが検出できません。
プログラムの流れとしては
MakeList(マイネットワークのLPITEMIDLIST)
{
LPITEMIDLIST pFileIDList;
 SHFILEINFO fi;
 CString pStr;
STRRET stFileName;

 IShellFolderにバインド
 IEnumIDListを取得
 IEnumIDListからアイテムIDを取得
 {
   ***->GetDisplayNameOf( pFileIDList,
SHGDN_FORPARSING,
&stFileName );
   pStr = stFileNameを文字列に変換
   SHGetFileInfo( pStr, 0, &fi, sizeof(SHFILEINFO), ... );
 }
}
という感じになっています。
「ネットワーク全体」についてはpStrにパスではなく
そのまま「ネットワーク全体」と入ってしまっています。

どのように検出しなければならないのでしょうか?

環境は Windows2000 + VC++6.0 です。


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

検出できない、というのは、SHGetFileInfo が失敗するということでしょうか?
GetDisplayNameOf でファイルパスを取得してそれを渡しているところから、そうだと思
われますが。

SHGetFileInfo のフラグに SHGFI_PIDL を加えてやれば、第一引数にファイルパスの代
わりに LPITEMIDLIST を指定できます。
ただし、それより上位の ITEMIDLIST を連結してやる処理が必要になるかと思われます
が。

ITEMIDLIST の連結などについては、kab-studio さん参照。
http://www.kab-studio.biz/
トップから「Codian」→「シェルエクステンション」→「アイテム ID リストとは?」
あたりに載っています。

#なんかつい先日、よく似たようなレスをした気がします(^^;


返信引用
Gon
 Gon
(@Gon)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>#なんかつい先日、よく似たようなレスをした気がします(^^;

ドキッ!?スイマセン…。
先日、会社の上司からいきなり慣れてもいないC++を使い、
初経験のMFCプログラムを作れと言われたうえ、シェルだのなんだのと
てんてこ舞いになっているものですから…。
現在も、こうしてネットを漂いながら情報収集の真っ最中です。

>検出できない、というのは、SHGetFileInfo が失敗するということでしょうか?

確かに、SHGetFileInfo を抜けると何も値が入っていないという状況です。
ただ、その前にGetDisplayNameOf で求め、StrRetToStrなどで
文字列へと変換した後のパスpStr が ネットワーク全体 という
値になっているところからおかしいのかな?と思っています。
これは合っているのでしょうか?

後、少々お聞きしたい事があります。
フォルダなどを列挙する時、CTreeCtrl のメンバである InsertItem で
ツリーを構成していくと思うのですが、親のハンドルはどのような方法で
取得、あるいは保存しておく事がベストなのでしょうか?
知り合いには「各ノードにクラスのポインタなどを持たせたらどうか」
という事を聞いたのですが、C++にあまり詳しくない私は???という
状況です。
初歩的な質問で申し訳ありません。
C++やMFCの本などを片手にプログラムを打っているのですが、
なかなか思うとおりにならないもので…。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

>先日、会社の上司からいきなり慣れてもいないC++を使い、
>初経験のMFCプログラムを作れと言われたうえ、シェルだのなんだのと
>てんてこ舞いになっているものですから…。

ご苦労様です。
私も4月から社会人です…ちょっと不安。
今のうちに MFC をみっちり勉強しておかねば…っと、駄文失礼いたしました。

>ただ、その前にGetDisplayNameOf で求め、StrRetToStrなどで
>文字列へと変換した後のパスpStr が ネットワーク全体 という
>値になっているところからおかしいのかな?と思っています。
>これは合っているのでしょうか?

ネットワーク全体 というオブジェクトにはファイルとしての実体がありませんから、
GetDisplayNameOf で SHGDN_FORPARSING を指定してもファイルパスは取得できないと思
います。
そもそも SHGDN_FORPARSING というフラグはファイルパスを求めるためのものではな
く、その名( for Parsing )の通り、パースできる形の文字列を取得するというもので
す。パースできる形式とは何かと言うと、同じ IShellFolder のメソッドである
ParseDisplayName( GetDisplayNameOf の逆で、文字列から ITEMIDLIST を求めるメソ
ッド )で解釈できる形式のことです。
要は、どんな文字列であろうと、それが ParseDisplayName で解釈できるものであれ
ば、GetDisplayNameOf の結果としては正常と言うことです。
ファイルの場合は、それがたまたまファイルパスであったということであり、ネットワ
ーク全体 という文字列を ParseDisplayName に渡して ITEMIDLIST が得られるのであ
れば(得られるかどうかは知りませんが)、それもまた正常な結果です。

もっと大雑把に考えれば、GetDisplayNameOf の戻り値が成功を示している時点で成功
だ、と判断することも可能ですが(笑

>フォルダなどを列挙する時、CTreeCtrl のメンバである InsertItem で
>ツリーを構成していくと思うのですが、親のハンドルはどのような方法で
>取得、あるいは保存しておく事がベストなのでしょうか?

えっと…ごめんなさい、よくわかりません(汗
InsertItem がアイテムのハンドルを返すので、次にその子を挿入するときまで保存して
おけばいいですよね。また、後で取得するなら GetParentItem なんていうメソッドがあ
るようですが。

>各ノードにクラスのポインタなどを持たせたらどうか
これは、TVITEM 構造体の lParam メンバにポインタを入れておく、ということだと思い
ます。lParam メンバの用途は自由ですから。

ところで、
http://homepage2.nifty.com/~kawano/program/sec2/sec2.html
なんかそのまんま使えそうなサンプルがありました。
業務で使う場合は作者の方に連絡を取ったほうがいいかもしれません。

ついでに、上の URL のページに気になることが。
>Shell Function の中に同じようなのがあるぞ とおっしゃる方、全くもってその通
>りでございます
まさか関数ひとつでフォルダツリーを構築できるようなのが…!?まさかとは思います
が、興味があるので少し調べてみようと思います。

#SHBrowseForFolder のことじゃ…ないだろうなぁ


返信引用
Gon
 Gon
(@Gon)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

>私も4月から社会人です…ちょっと不安。
>今のうちに MFC をみっちり勉強しておかねば…っと、駄文失礼いたしました。

頑張って下さい!
社会に出てからは色々と学ぶ事が多過ぎて、手に付かなくなってきますから。

>これは、TVITEM 構造体の lParam メンバにポインタを入れておく、
>ということだと思います。lParam メンバの用途は自由ですから。

ネットなどで色々とTVITEM 構造体の lParam メンバについて
調べて見たのですが、あまり詳細の載っているHPが見つからず、
未だにどういったものなのかが分かりません。
とあるサイトで「項目に関連付けられた 32 ビット値を指定します」
という説明を見つけたのですが、さっぱり意味が分かりません…。
これはどういったメンバなのでしょうか…?

また今日も一日、ネットワーク全体をどうするかで悩んでしまいました。
う~ん、上手く行かないものですね…。

>#SHBrowseForFolder のことじゃ…ないだろうなぁ

そういえば以前、こちらの掲示板で紹介して頂いた
http://www.kab-studio.biz/
こちらのサイトでも SHBrowseForFolder について解説されていましたね…。
これだけ苦労して、関数一つでフォルダツリーが構築できる!
なんてことになったら悲しいな…。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

シャノンさんも書かれているように、lParamはユーザーが自由に使える部分です。
32ビット値を値と見るかポインタ値としてみるかも使う側の使い方次第です。
通常は、外部データとのリンクを取るためのインデックス値を入れたり、
その外部データへのポインタを直接入れたり出来ます。
この部分の管理はプログラマにまかされています。

>こちらのサイトでも SHBrowseForFolder について解説されていましたね…。
うまくすれば、このダイアログを貼り付けてOKというわけにはいかないかなぁ。
まあ、ボタン消したりウインドウスタイル変えたりしないといけませんけどね。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました