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

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

Восстановить пароль Регистрация
 
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
14.06.2011, 14:16     Помогите правильно реализовать метод IEnumIDList::Next #1
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.
Вот мой код (похоже неправильный):
Код
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++
C++ Реализовать метод minutes()
Как правильно реализовать заполнение двумерного массива элементами C++
C++ Как реализовать метод ToString?
Реализовать метод Гаусса функцией C++
Программно реализовать метод ядерных строк C++
C++ Метод Гаусса. Реализовать ввод с клавиатуры
C++ Как правильно объявить статический метод

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

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

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