Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
#1

Помогите правильно реализовать метод IEnumIDList::Next - C++

14.06.2011, 14:16. Просмотров 681. Ответов 0
Метки нет (Все метки)

HRESULT Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched);
Теоретически размер структуры ITEMIDLIST переменный, т.е. если celt > 1 и несколько структур ITEMIDLIST имеют разный размер, то я не понимаю как я смогу вернуть в *rgelt адрес на массив таких структур?
в MSDN про rgelt написано:
rgelt
Address of an array of ITEMIDLIST pointers that receives the item identifiers. The implementation must allocate these item identifiers using the Shell's allocator (retrieved by the SHGetMalloc function). The calling application is responsible for freeing the item identifiers using the Shell's allocator.
Вот мой код (похоже неправильный):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
STDMETHODIMP CAShellFolder::Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched){
    ATLTRACE2('
CAShellFolder::Next(...){ this=%8.8X ', this);
    //проверяем корректность аргументов
    if(!rgelt || (!pceltFetched && celt > 1)){
        ATLTRACE2('ret E_INVALIDARG }');
        return E_INVALIDARG;
    }
    if(!celt){
        ATLTRACE2('celt=0 ret S_OK }');
        return S_OK;    //просили 0 вот и возвращаем ничего
    }
 
    //задаём возвращаемые в аргументах значения значениями по умолчанию
    *rgelt = 0;
    if(pceltFetched) *pceltFetched = 0;
    
    //отсеиваем частные случаи
    unsigned int remain = m_childCount - m_childPos;    //кол-во оставшихся элементов
    if(!remain){
        ATLTRACE2('remain=0 ret S_FALSE }');
        return S_FALSE;
    }
 
    //задаём возвращаемое значение значением по умолчанию
    HRESULT retval = S_OK;
 
    //корректируем кол-во запрашиваемых элементов если их больше чем осталось
    if(celt > remain){
        retval = S_FALSE;
        celt = remain;
    }
 
    //выделяем память для массива указателей на PIDL-ы
    *rgelt = (LPITEMIDLIST)m_pMem->Alloc(sizeof(LPITEMIDLIST)*celt);  //???
    if(!*rgelt){
        ATLTRACE2('ret E_OUTOFMEMORY }');
        return E_OUTOFMEMORY;
    }
    ZeroMemory(*rgelt, sizeof(LPITEMIDLIST)*celt);  //на всякий пожарный
 
    for(unsigned int i = m_childPos; i < m_childPos+celt; i++){
        rgelt[i-m_childPos] = (ITEMIDLIST *)m_pIDLChild[m_childPos];  //???
    }//for i
 
    m_childPos += celt; //продвигаем указатель текущего элемента
    if(pceltFetched) *pceltFetched = celt;
    ATLTRACE2('ret %ld }', retval);
    return retval;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2011, 14:16     Помогите правильно реализовать метод IEnumIDList::Next
Посмотрите здесь:

C++ Помогите правильно сделать *.exe
C++ Реализовать метод minutes()
C++ Помогите реализовать динамический массив
C++ Как реализовать метод ToString?
Реализовать метод Гаусса функцией C++
Помогите реализовать стек C++
Как правильно реализовать инициализацию массива функцией? C++
C++ Как правильно реализовать полиморфизм?
Как правильно реализовать класс? C++
C++ Как правильно реализовать обобщённый класс?
Как правильно реализовать множественное наследование? C++
C++ Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 22:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru