SHBrowseForFolder 関数はユーザーによるシェルフォルダの選択を可能にするダイアログを表示します。
#include <windows.h>
#include <tchar.h>
#include <shlobj.h>
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData);
int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
TCHAR szFolderName[MAX_PATH * sizeof(WCHAR) / sizeof(TCHAR)];
LPCTSTR lpszInitDir = TEXT("c:\\"); //初期フォルダ
BROWSEINFO bi = {0};
bi.hwndOwner = NULL;
bi.pidlRoot = (LPCITEMIDLIST)CSIDL_DESKTOP;
bi.lpszTitle = TEXT("フォルダを選択してください。");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallbackProc;
bi.lParam = reinterpret_cast<LPARAM>(lpszInitDir);
//フォルダ選択ダイアログを表示
LPITEMIDLIST ppidl;
ppidl = SHBrowseForFolder(&bi);
if(ppidl != NULL) {
//結果をファイルシステムパスに変換
if(SHGetPathFromIDList(ppidl, szFolderName)) {
//結果を表示
MessageBox(NULL, szFolderName, NULL, 0);
}
//ITEMIDLISTを開放
CoTaskMemFree(ppidl);
}
return 0;
}
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
{
UNREFERENCED_PARAMETER(lp);
switch(uMsg) {
case BFFM_INITIALIZED:
{
if(pData != NULL) {
//初期フォルダを設定
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
}
break;
}
default:
break;
}
return 0;
}