mfc - IFileDialog 或 SHBrowseForFolder:如何打开显示“计算机”的内容,最好不显示左侧的桌面等?
问题描述
此代码的任何一个版本都可以正常工作,但我的磁盘实用程序仅适用于物理文件夹,而不适用于 Workgroup 之类的东西。有什么方法可以将其限制为实际的文件系统实体?
这是我当前的 IFileDialog 版本:
IFileDialog *pfd;
if ( CoCreateInstance( CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS( &pfd ) ) != S_OK ) {
AKS( AKSWarn, "CoCreateInstance() failed" );
return;
}
DWORD dwOptions;
pfd->GetOptions( &dwOptions );
pfd->SetOptions( dwOptions | FOS_PICKFOLDERS );
if ( pfd->Show( NULL ) != S_OK ) {
AKS( AKSWarn, "IFileDialog::Show() failed" );
pfd->Release();
return;
}
IShellItem *psi;
if ( pfd->GetResult( &psi ) != S_OK ) {
AKS( AKSWarn, "IFileDialog::GetResult() failed" );
pfd->Release();
return;
}
LPWSTR pwcsChoice;
if ( psi->GetDisplayName( SIGDN_DESKTOPABSOLUTEPARSING,
&pwcsChoice ) != S_OK ) {
AKS( AKSWarn, "IFileDialog::GetResult() failed" );
psi->Release();
pfd->Release();
return;
}
char szChoice[ 500 ];
wcstombs( szChoice, pwcsChoice, sizeof( szChoice ) );
peditRoot->SetWindowText( szChoice );
CoTaskMemFree( pwcsChoice );
psi->Release();
pfd->Release();
SHBrowseForFolder() 是使用我从 MSFT 网站获得的包装函数调用的:
static bool GetFolder( string& folderpath, const char* szCaption = NULL,
HWND hOwner = NULL ) {
bool retVal = false;
// The BROWSEINFO struct tells the shell
// how it should display the dialog.
BROWSEINFO bi = { 0 };
bi.ulFlags = BIF_USENEWUI;
bi.hwndOwner = hOwner;
bi.lpszTitle = szCaption;
// must call this if using BIF_USENEWUI
::OleInitialize( NULL );
// Show the dialog and get the itemIDList for the
// selected folder.
LPITEMIDLIST pIDL = ::SHBrowseForFolder( &bi );
if ( pIDL ) {
char szBuf[_MAX_PATH] = { '\0' };
if ( ::SHGetPathFromIDList( pIDL, szBuf ) ) {
// Set the string value.
folderpath = szBuf;
retVal = true;
} else
SCWinUtilMessageBoxVA( hOwner, "Error Browsing", MB_OK,
"This app can only work with actual disks or folders, not "
"Control Panel, Workgroup, etc." );
// free the item id list
CoTaskMemFree( pIDL );
}
::OleUninitialize();
return retVal;
}
堆栈溢出抱怨我提供了太多代码。所以我必须在底部添加一些文本来填充它,显然。堆栈溢出抱怨我提供了太多代码。所以我必须在底部添加一些文本来填充它,显然。堆栈溢出抱怨我提供了太多代码。所以我必须在底部添加一些文本来填充它,显然。堆栈溢出抱怨我提供了太多代码。所以我必须在底部添加一些文本来填充它,显然。
解决方案
推荐阅读
- postgresql - 使用快照克隆 AWS RDS
- c# - asp.net core windows 身份验证 + 慢速网络上的自己的数据库授权
- javascript - Json 创建响应未达到要求
- c - ioctl 为扇区大小返回 140733193388544
- javascript - 如何获得原始样式,就像我们使用 computedStyle 属性但没有计算一样?
- automapper - AutoMapAttribute 和多态性
- swiftui - SwiftUI 中形状的动态高度
- java - mvn azure-functions:deploy 创建“无效的存储帐户名称”
- jquery - 为什么我想在 django 项目的 js 中加载 html 文件时出现错误?
- python - ctypes 范围内的字符串缓冲区