Всем привет.
Недавно узнал, что в Висте с помощью EnumObjects интерфейса IShellFolder можно получить список папок и файлов в подключенном к PC PDA.
Вопрос в том, что получить информацию о папке/файле на PDA можно только с помощью функции SHGetFileInfo, но с ее помощью нельзя получить ни время создания/редактирования файла, ни его размер, что очень надо. А вот функция SHGetDataFromIDList, с помощью которой, по мнению MSDN'а, надо получать такого рода информацию, не работает в Висте.
Кто-нибудь сталкивался с таким странным ее поведением? Или может подсказать, как узнать информацию о файле/папке на PDA?
Вот кусок кода, дял получения списка дочерних файлов/папок.
Если что непонятно, могу прокомментировать.
LPShellItemList GetSubFolders()
{
HRESULT hRes;
LPShellItemList pFamily = NULL;
CShellItem* pChild = NULL;
if ( !IsFolder() )
{
return pFamily;
// throw ("Unable to retrieve sub-folders for a non-folder.");
}
LPENUMIDLIST pEnum = NULL;
hRes = ShellFolder()->EnumObjects( NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS , &pEnum );
if( !SUCCEEDED( hRes ) )
{
return pFamily;
}
pFamily = new ShellItemList;
LPITEMIDLIST pIDL = NULL;
ULONG iGot = 0;
pEnum->Next( 1, &pIDL, &iGot );
while ( pIDL != NULL && iGot == 1 )
{
WIN32_FIND_DATA ffd;
hRes = SHGetDataFromIDList(ShellFolder(), pIDL, SHGDFIL_FINDDATA, &ffd, sizeof(WIN32_FIND_DATA));
// вот в этом месте для PDA папок hRes = E_FAIL, а для PC папок (пусть и специальных) hRes = S_OK
pChild = new CShellItem( pIDL, this );
pFamily->push_back( pChild );
pIDL = NULL;
iGot = 0;
pEnum->Next( 1, &pIDL, &iGot );
}
if ( pEnum != NULL )
pEnum->Release();
return pFamily;
}
Ничто не дается нам так дешево и не ценится так дорого, как вежливость (М. Сервантес)