ネットワーク共有フォルダ以下が指定できない!!
\\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 件のコメント:
コメントを投稿