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

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

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

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

14.06.2011, 14:16. Просмотров 698. Ответов 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++
Не знаю как правильно здесь реализовать метод добавления и удаления объектов в хранилище без перегрузки. Заранее спасибо. #include...

Как правильно реализовать класс? - C++
Вопрос первый при реализации классов на java, я для каждого класса создавал новый файл, как это лучше реализовать в c++ есть ли возможность...

Как правильно реализовать полиморфизм? - C++
Имеется такая иерархия классов //classes.h class CL1 { private: int x; virtual char c;

Как правильно реализовать множественное наследование? - C++
Всем привет. Нужна помощь. Вот смотрите. Имеется простой класс. От него порождаются два класса-наследника. А от этих двух классов...

Как правильно реализовать обобщённый класс? - C++
хочу создать класс class MyGenericClass&lt;T&gt; Ругается на эту T. убрать не вариант,нужна дальше

Реализовать метод minutes() - C++
Поле first - положительное целое число, часы; полет second - положительное целое число, минуты. Реализовать метод minutes() - перевод...

Помогите реализовать стек - C++
Здравствуйте. Помогите, пожалуйста, решить задачу: Реализуйте структуру данных &quot;стек&quot;, реализовав все указанные здесь методы при помощи...

Метод прямоугольников (всё ли правильно?) - C++
Доброго времени суток Задачка такова Использовать метод прямоугольников. Для Построения прямоугольника использовать середину...

Помогите правильно сделать *.exe - C++
Я пока только учусь и пишу под консоль в среде Visual Studio 2008....)) Никто не знает как нужно изменить настройки проэкта, чтоб мой...

Как правильно реализовать инициализацию массива функцией? - C++
Здравствуйте! Мне нужно что бы вся инициализация массива происходила в отдельной функции и что бы этот массив можно было в дальнейшем...


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

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

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