你好,我正在使用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”吗?为什么它显示为空?
提前致谢。
答案 0 :(得分:2)
if (SHGetPathFromIDList (pitemidl, path)) result = path;
这一行是你的问题。 result
不是类似std::string
的类,它只是指向一个或多个TCHAR
的缓冲区的指针。像这样分配只是将指针更改为指向path
,它不会将path
复制到result
指向的缓冲区中。
如果您不想更改为使用string
类,则需要调用函数将字符串复制到提供的缓冲区中。例如:
StringCchCopy(result, MAX_PATH, path);
(这假设缓冲区大小为MAX_PATH
个字符。)