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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Выделение памяти средствами Win32 (COM) http://www.cyberforum.ru/cpp-beginners/thread496336.html
Чем отличаются варианты выделения памяти? 1) SHAlloc 2) SHGetMalloc...IMalloc::Alloc 3) CoGetMalloc...IMalloc::Alloc 4) CoTaskMemAlloc 5) new Можно ли их смешивать? Например:...
C++ Замена 2х меню в MDI приложении Уважаемые коллеги, помогите разобратья. Я занимаюсь руссификацией MDI приложения, все ресурсы подгружаю из dll. Встала задача переключиться на русские меню, а их 2 штуки. Одно (IDR_MAINFRAME)... http://www.cyberforum.ru/cpp-beginners/thread496316.html
Получение из другой формы ТStringList C++
Не знаю куда это больше подходит, но появилась необходимость из Form2 получить доступ к ТStringList *myList = new ТStringList(); находящемуся в Form1. Есть ли какая то простая возможность это...
C++ Как мне вызвать GetGuiResources в консольном приложении VS6?
Приветствую! Подскажите плиз, как мне вызвать GetGuiResources в консольном приложении VS6. Код: #include <windows.h> #include <winuser.h> HWND hWnd; DWORD dwProcID; HANDLE hProcess; DWORD...
C++ Открылись вакансии в крупную иностранную компанию http://www.cyberforum.ru/cpp-beginners/thread496029.html
Крупная иностранная компания, занимающаяся продвижением на Интернет-рынок виртуальных казино, с возможностями карьерного роса, приглашает сотрудников на следующие вакансии: 1.UNIX-разработчик...
C++ Шаблон set и структура - как вместе? Что-то торможу. typedef set<Node> NodeSet; struct Node{ NodeSet input; NodeSet output; }Как это сделать? Ставлю перед typedef - struct Node; - нифига. подробнее

Показать сообщение отдельно
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100

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

14.06.2011, 14:16. Просмотров 706. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru