0

您好,我正在使用带有 MS VC++ 2010 的 Windows API 开发 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”不应该通过引用来修改吗?为什么显示为空?

提前致谢。

4

1 回答 1

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

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

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

StringCchCopy(result, MAX_PATH, path);

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

于 2013-10-07T04:24:15.400 回答