フォルダ選択ダイアログの表示 -2 これは、No.a0004の拡張である。コールバック関数を書くことで最初から任意のフォルダを選択した状態にできる。

LPMALLOC pMalloc;
// IMallocインターフェイスへのポインタを取得します。
if( ::SHGetMalloc( &pMalloc ) != NOERROR )
  return ;

char szPath[_MAX_PATH];
char szIniPath[] = "c:\\temp"; // このフォルダを初期選択する
LPITEMIDLIST pidlRoot, pidlBrows;
::SHGetSpecialFolderLocation(this->GetSafeHwnd(), CSIDL_DRIVES, &pidlRoot);
BROWSEINFO bi;
::ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = this->GetSafeHwnd();
bi.pidlRoot = pidlRoot; // NULL の時マイコンピュータから表示
bi.pszDisplayName = szPath;
bi.lpszTitle = "フォルダを選択してください";
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)szIniPath;
//bi.iImage

pidlBrowse = ::SHBrowseForFolder(&bi);
if (pidlBrowse)
  ::SHGetPathFromIDList(pidlBrowse, szPath);


if( pidlRoot != NULL )
    pMalloc->Free( pidlRoot );
if( pidlBrowse != NULL )
    pMalloc->Free( pidlBrowse );
pMalloc->Release();

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

コールバック関数でいろいろ処理ができるようだ。

初期フォルダとして渡すパスは最後の\はつけない(但しルートディレクトリは別)、また渡したパスが無かった時は表示されるルートが選択されるようだ。
これらはCOMの知識が多少は必要


VC覚書きページ...