SHGetDataFromIDList в Висте
От: legs Россия  
Дата: 24.10.07 11:28
Оценка:
Всем привет.
Недавно узнал, что в Висте с помощью 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;
}
Ничто не дается нам так дешево и не ценится так дорого, как вежливость (М. Сервантес)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.