c00*_*0fd 4 c++ winapi mfc cfiledialog
有人可以让我知道我在这里做错了什么吗?
MFC 项目,我用来CFileDialog让用户选择多个文件,如下所示:
CFileDialog fd(TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ALLOWMULTISELECT,
NULL, this);
if(fd.DoModal() == IDOK)
{
//Multi-selection
CString strPaths;
POSITION fileNamesPosition = fd.GetStartPosition();
while(fileNamesPosition != NULL)
{
if(!strPaths.IsEmpty())
strPaths += L"\n";
strPaths += fd.GetNextPathName(fileNamesPosition);
}
AfxMessageBox(strPaths);
}
Run Code Online (Sandbox Code Playgroud)
所以如果说的话,有两个快捷方式文件:
shortcut_1.lnk文件指的是:"D:\Folder\Project_B\Release\Name of Project B.exe"
shortcut_2.lnk这指的是"D:\Folder\Project_A\Release\Name of Project A.exe"
如果我从上面代码生成的“文件打开”对话框中选择它们,我的结果strPaths将变为以下内容,这是不正确的:
D:\Folder\Project_A\Release\Name of Project A.exe
D:\Folder\Project_A\Release\Name of Project B.exe
Run Code Online (Sandbox Code Playgroud)
第二条路是错误的!
使用GetStartPosition()和GetNextPathName()函数是一团糟。其一,他们使用旧式 API ,该 API 取决于通过OPENFILENAMEstruct定义的正确返回缓冲区大小。MFC不关心这个!正如您的问题所示,即使缓冲区大小足够大,它也存在链接问题。
为了省去麻烦,请使用Vista+ API,该 API 可通过CFileDialog::GetIFileOpenDialog().
这是一个工作代码示例:
CFileDialog fd( TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ALLOWMULTISELECT,
NULL, nullptr );
if (fd.DoModal() == IDOK)
{
//Multi-selection
CString strPaths;
CComPtr<IFileOpenDialog> piod = fd.GetIFileOpenDialog();
ASSERT( piod );
CComPtr<IShellItemArray> pResults;
if( SUCCEEDED( piod->GetResults( &pResults ) ) )
{
DWORD count = 0; pResults->GetCount( &count );
for( DWORD i = 0; i < count; ++i )
{
CComPtr<IShellItem> pItem;
if( SUCCEEDED( pResults->GetItemAt( i, &pItem ) ) )
{
CComHeapPtr<wchar_t> pPath;
if( SUCCEEDED( pItem->GetDisplayName( SIGDN_FILESYSPATH, &pPath ) ) )
{
if( !strPaths.IsEmpty() )
strPaths += L"\n";
strPaths += pPath;
}
}
}
}
AfxMessageBox( strPaths );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |