CFileDialog有多个文件选择的问题

时间:2014-07-23 23:58:15

标签: c++ winapi mfc windows-shell

我正在使用以下代码通过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上设置了几个用户帐户,而我正在测试此方法的是一个标准用户帐户。我正在运行此方法的应用程序未运行提升(或具有常规用户权限),因此无论如何它都不应该访问其他用户帐户。

那我在这里做错了什么?

1 个答案:

答案 0 :(得分:4)

检查了源,GetOpenFileName假设所有项目实际上都在同一文件路径中。这对于桌面来说是不正确的(不同路径中的项目合并到一个shell视图中),因此您将看到不良行为。

解决方案是使用Common Item dialogs,它使用shell命名空间而不是文件系统路径。所有桌面项都在一个公共shell路径中,然后您可以使用IShellItem::GetDisplayName转换为文件系统路径。

不幸的是,MFC没有公共项目对话框的包装器,因此您必须自己管理它。