日曜日, 5月 18, 2008

For Folder

SHBrowseForFolder()で初期選択フォルダを指定する際に
ネットワーク共有フォルダ以下が指定できない!!

\\ServerPC\ShareFolder\temp
等を指定すると, 存在しないフォルダと判定されて
マイコンピュータが初期選択されてしまう.

初期選択はコールバックで行うのだけれども, 以下の様にしていました.

int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION, (LPARAM)TRUE, (LPARAM)lpData);
}
}


上記コールバックの引数lpDataはSHBrowseForFolder()を呼ぶ際に渡す構造体BROWSEINFOのメンバ
LPARAM lParamに指定した値がそのまま渡されてきます.
上記コードは初期指定パス(char型配列)へのポインタが指定されている事を期待しています.

このコードでネットワーク以外の任意指定は可能だったので
SendMessage()に異なる指定方法があるとは思わなかった.
色々, サンプルコードを見ていたのだけれど気付かずに見落としてしまっていた.

結局以下のコードでネットワークの共有フォルダへの初期指定も可能なはずです.

int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION, (LPARAM)FALSE, (LPARAM)lpData);
}
}


何が違うか??
SendMessage()に指定する3番目の引数をFALSEにしています.
その際は, 4番目に指定する値をITEMIDLISTへのポインタとします.

それだけです.

シェル絡みの関数を使用する際はちゃんとシェルネームスペースを意識して
ITEMIDLISTを使えって事でしょうか??

あと, 今回痛かったのはMSDNが移行時期に入っていて, 旧コンテンツから
新コンテンツへのリダイレクトが(正しく)行われていない??ために,
リンク切れが異常に多かった.

前はあったと記憶している日本語訳されたSHBrowseForFolder()の
コンテンツが移行後にはなくなっている??
(今後追加されると良いのだけれど….)

よって, 日本語版のMSDNで検索掛けてもなかなか思うように仕様が出てこないので
英語圏のGoogle先生に聞いてみましょう.
日本語用の検索時にも
・ウェブ全体から検索
・日本語のページを検索
と指定は出来るけれども, 検索結果は全く違うので注意が必要です.

参考リンク(いずれもMSDN)
SHBrowseForFolder Function
BROWSEINFO Structure
BrowseCallbackProc Function

0 件のコメント: