CFolderDialog の代わりに次の関数を使用しています。フォルダ パスを取得するために...以下のコードを確認してください....エディット ボックスでフォルダ パス名を印刷しようとすると実行時エラーが発生します..
ボイド CSelfExtractorUIDlg::OnBnClickedButton1() {
CDialog dlg;
HWND hwnd = NULL; LPCTSTR szCurrent = (LPCTSTR)malloc(25*sizeof(TCHAR)); szCurrent = NULL; LPTSTR szPath = (LPTSTR)malloc(25*sizeof(TCHAR)); BOOL チェック = BrowseForFolder(hwnd,szCurrent,szPath); if( チェック == TRUE) { dlg.SetDlgItemTextW(IDC_EDIT1,szPath); }
}
BOOL BrowseForFolder(HWND hwnd, LPCTSTR szCurrent, LPTSTR szPath) { BROWSEINFO bi = { 0 }; LPITEMIDLIST pidl; TCHAR szDisplay[256]; BOOL retval;
//CoInitialize();
bi.hwndOwner = hwnd; bi.pszDisplayName = szDisplay; bi.lpszTitle = TEXT("フォルダを選択してください。"); bi.ulFlags
= BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn
= BrowseCallbackProc; bi.lParam = (LPARAM) szCurrent;pidl = SHBrowseForFolder(&bi);
if (NULL != pidl) { retval = SHGetPathFromIDList(pidl, szPath); CoTaskMemFree(pidl); } そうでなければ { retval = FALSE; }
if (!retval) { szPath[0] = TEXT('\0'); }
CoUninitialize(); retval を返します。
} static int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg, LPARAM lParam, LPARAM lpData) { // BFFM_INITIALIZED メッセージを受信した場合 // パスを開始パスに設定します。
スイッチ (uMsg) { case BFFM_INITIALIZED: { if (NULL != lpData) { SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); } } }0 を返します。// 関数