0
返回選定的文件夾弦

你好我正在使用與MS VC++ 2010的Windows API的Windows應用程序,並選擇文件夾,我有以下代碼:的SHBrowseForFolder沒有參考

BOOL BrowseFolder(TCHAR *result) 
{ 
    BROWSEINFO brwinfo = { 0 }; 
    brwinfo.lpszTitle = _T("Select Your Source Directory"); 
    brwinfo.hwndOwner = hWnd; 
    LPITEMIDLIST pitemidl = SHBrowseForFolder (&brwinfo); 

    if (pitemidl == 0) return FALSE; 

    // get the full path of the folder 
    TCHAR path[MAX_PATH]; 
    if (SHGetPathFromIDList (pitemidl, path)) result = path; 

    IMalloc *pMalloc = 0; 
    if (SUCCEEDED(SHGetMalloc(&pMalloc))) 
    { 
     pMalloc->Free(pitemidl); 
     pMalloc->Release(); 
    } 

    ::MessageBox(hWnd, result, "input", MB_OK); 
    ::MessageBox(hWnd, inputFolder, "input", MB_OK); // Reference Test 
    return TRUE; 
} 

所以,它打開打開瀏覽文件夾對話框,將所選文件夾字符串保存在參考參數「result」中,如果一切正常,則返回true。

後來我打電話:

BrowseFolder(inputFolder); 

,當我嘗試打印出「inputFolder」的內容,它顯示空白(inputFolder是一個全局變量TCHAR* inputFolder

正如你可以在看BrowseFolder定義我發送兩個消息框一個爲「結果」,另一個爲「inputFolder」(最後一個顯示爲空)

所以我的問題是..如果我打電話:BrowseFolder(inputFolder);不應該「inputFolder」參考?它爲什麼顯示爲空?

在此先感謝。

回答

2
if (SHGetPathFromIDList (pitemidl, path)) result = path; 

這條線是你的問題。 result不是像std::string這樣的類,它只是指向一個或多個TCHAR的緩衝區的指針。像這樣分配它只需將指針更改爲指向path,它不會將path複製到result指向的緩衝區中。

如果您不想更改爲使用string類,則需要調用函數以將字符串複製到提供的緩衝區中。例如:

StringCchCopy(result, MAX_PATH, path); 

(假設緩衝區大小爲MAX_PATH)。

+0

是的,這是,我改變了指針的參考,我沒有看到它。上面的代碼工作,但我不得不將inputFolder全局變量更改爲MAX_PATH固定大小的數組而不是指針。非常感謝 –