我正在使用以下代码通过UI检索多个文件选择:
CFileDialog fd(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,
NULL, hParentWnd ? CWnd::FromHandle(hParentWnd) : NULL);
fd.m_pOFN->Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_NODEREFERENCELINKS;
int nLnBuff = 32767;
TCHAR* pBuffFileSelect = new TCHAR[nLnBuff];
memset(pBuffFileSelect, 0, nLnBuff * sizeof(TCHAR));
fd.m_ofn.lpstrFile = pBuffFileSelect;
fd.m_ofn.nMaxFile = nLnBuff;
if(fd.DoModal() == IDOK)
{
POSITION fileNamesPosition = fd.GetStartPosition();
while(fileNamesPosition != NULL)
{
CString strSelPath = fd.GetNextPathName(fileNamesPosition);
TRACE("path: %s\n", CStringA(strSelPath));
}
}
delete[] pBuffFileSelect;
所以当我在我的电脑上试用它时,我运行上面的方法,当打开“打开文件”对话框时,作为测试,我导航到我的桌面并使用Ctrl + A快捷方式选择所有文件然后单击打开。结果我开始得到以下路径:
The first path is a link, which is correct (it exists on my Public desktop):
"C:\Users\Public\Desktop\avp.lnk"
But then the second path is wrong. It gives me:
"C:\Users\Public\Desktop\1.txt"
when it's supposed to be (for the desktop that I picked):
"C:\Users\UserName\Desktop\1.txt"
然后每个连续路径都有“Public”而不是“UserName”。
我应该指出,我在这台PC上设置了几个用户帐户,而我正在测试此方法的是一个标准用户帐户。我正在运行此方法的应用程序未运行提升(或具有常规用户权限),因此无论如何它都不应该访问其他用户帐户。
那我在这里做错了什么?
答案 0 :(得分:4)
检查了源,GetOpenFileName假设所有项目实际上都在同一文件路径中。这对于桌面来说是不正确的(不同路径中的项目合并到一个shell视图中),因此您将看到不良行为。
解决方案是使用Common Item dialogs,它使用shell命名空间而不是文件系统路径。所有桌面项都在一个公共shell路径中,然后您可以使用IShellItem::GetDisplayName转换为文件系统路径。
不幸的是,MFC没有公共项目对话框的包装器,因此您必须自己管理它。