最終更新 2003 10/10
サンプルのダウンロード → API_SHBrowseForFolder.lzh(36k)
全ソースコード
SHBrowseForFolder 関数
SHGetPathFromIDList 関数
CoTaskMemFree 関数
対応しているバージョン
95, 98, Me, NT4.0以降, CE, 2000, XP
使用するヘッダとライブラリ
shlobj.h
shell32.lib
|
【 必要なヘッダとライブラリの読み込み 】
フォルダを選択するダイアログを使用するには SHBrowseForFolder()
関数を使います。
この関数を使うには shlobj.h をインクルードしないといけません。
それから、プロジェクト−設定−リンク・・・の項目で shell32.lib を
設定します。
デフォルトでは設定されているのですが、念のためサンプルでは
#pragma comment を使って shell32.lib を読み込んでいます。
サンプルを見れば処理の流れはだいたいお分かり頂けると思います。
【 パスを格納する配列を宣言 】
まずはパスを受け取るための char 型の配列を宣言します。
配列のサイズには MAX_PATH を指定します。MAX_PATH には
扱えるパスの最大文字列が設定されています。
使用できない時は stdlib.h をインクルードしてみて下さい。
配列の値は'\0'で初期化しておきます。
サンプルではめんどうなので ZeroMemory() を使っています。
【 BROWSEINFO構造体の設定 】
次に SHBrowseForFolder() 関数の引数にわたすための
BROWSEINFO 構造体の変数を宣言して、メンバの値を設定します。
BROWSEINFO 構造体のメンバ変数
hwndOwner = 親ウィンドウのハンドル ( 通常は NULL )
pidlRoot = ここに指定したフォルダとサブフォルダのみ
表示する ( 通常は NULL )
値は ITEMIDLIST 構造体へのポインタを指定
pszDisplayName = 選択したフォルダを受け取る文字列のポインタ
lpszTitle = ダイアログボックスのタイトルバーに表示する
文字 ( NULL指定可 )
lpfn = イベントを受け取るコールバック関数のポインタ
( 使用しない場合は NULL )
lParam = 上のコールバック関数が受け取る値
iImage = 選択されたフォルダに関連付けられたイメージを
受け取る変数
システムイメージリストのインデックスを指定
ulFlags = 動作フラグ
最低限、設定が必要な変数は pszDisplayName, ulFlags の2つで
しょうか・・・
ulFlags に設定する値は、ごく普通のフォルダを選択するダイアログに
したい時はサンプルのように BIF_RETURNONLYFSDIRS を設定します。
以下に ulFlags メンバに指定できるフラグの種類と説明を
書いておきます。
BIF_BROWSEFORCOMPUTER コンピューターのみ選択可能
BIF_BROWSEFORPRINTER プリンターのみ選択可能
BIF_BROWSEINCLUDEFILES ファイルも表示
(Shellのバージョン4.71以上)
BIF_DONTGOBELOWDOMAIN ネットワークフォルダは選択不可
BIF_EDITBOX エディットボックスを表示 (4.71以上)
BIF_RETURNFSANCESTORS フォルダのみ選択可能になる
(マイコンピュータやドライブは選択不可)
BIF_RETURNONLYFSDIRS ファイルの読み書きができるドライブや
フォルダだけ選択可能
BIF_STATUSTEXT コールバック関数からメッセージを送信して
ステータステキストを設定できる
BIF_VALIDATE 無効な名前が入力されると
BrowseCallbackProc()関数に
BFFM_VALIDATEFAILEDメッセージを設定して
呼ぶ(BIF_EDITBOX 指定時)
【 SHBrowseForFolder() 関数呼び出し 】
値の設定が終わったら、SHBrowseForFolder() 関数を呼び出します。
戻り値には LPITEMIDLIST 構造体変数を設定します。
この LPITEMIDLIST 構造体変数に選択したフォルダのID
(フォルダの識別番号?)が格納されます。
IDがNULLの時は、フォルダの選択がキャンセルされたか関数が
失敗したことになります。
NULLでなければ、今度は受け取ったフォルダ名からそのフォルダの
絶対パスを取得する作業を行います。
【 絶対パスの取得 】
SHBrowseForFolder() 関数で得られるのは、フォルダ名だけでパスは
含まれません。
ですから、実際にファイルの読み書きなどで使うには、絶対パスに
変換する必要があります。
フォルダのIDから絶対パスを得るには SHGetPathFromIDList()
関数を使います。
SHBrowseForFolder() 関数の戻り値で得られたフォルダのIDを
この関数に渡すとフォルダのIDと関連のある絶対パスを返して
くれます。
【 メモリの解放 】
値の取得に成功したら CoTaskMemFree() 関数を使って、ウィンドウズが
フォルダの選択時に確保したメモリを解放します。
SHGetPathFromIDList() 関数は、絶対パスを取得する時に、メモリを
確保するみたいです。
多分、malloc() や GlobalAlloc() なんかと同じような感じでメモリの
確保をしていると思うので、確保したメモリはメモリリークを防ぐために
解放しておきましょう。
|