SHBrowseForFolder不通过引用返回Selected文件夹字符串

时间:2013-10-07 04:17:45

标签: winapi visual-c++ reference pass-by-reference visual-c++-2010

你好,我正在使用Windows API和MS VC ++ 2010开发Windows应用程序,我有以下代码来选择文件夹:

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”吗?为什么它显示为空?

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

这一行是你的问题。 result不是类似std::string的类,它只是指向一个或多个TCHAR的缓冲区的指针。像这样分配只是将指针更改为指向path,它不会将path复制到result指向的缓冲区中。

如果您不想更改为使用string类,则需要调用函数将字符串复制到提供的缓冲区中。例如:

StringCchCopy(result, MAX_PATH, path);

(这假设缓冲区大小为MAX_PATH个字符。)