Любая версия этого кода работает нормально, но моя дисковая утилита работает только с физическими папками, а не с рабочими группами.Есть ли способ ограничить его фактическими сущностями файловой системы?
Вот моя текущая версия 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;
}
Вызывает переполнение стека. Я предоставил слишком много кода.Так что я должен добавить немного текста внизу, по-видимому.Переполнение стека жалуется, я предоставил слишком много кода.Так что я должен добавить немного текста внизу, по-видимому.Переполнение стека жалуется, я предоставил слишком много кода.Так что я должен добавить немного текста внизу, по-видимому.Переполнение стека жалуется, я предоставил слишком много кода.Так что я должен добавить немного текста внизу, по-видимому.