Форум программистов, компьютерный форум 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 Можно ли их смешивать? Например: p=CoTaskMemAlloc(n); ... SHFree(p);
C++ Замена 2х меню в MDI приложении Уважаемые коллеги, помогите разобратья. Я занимаюсь руссификацией MDI приложения, все ресурсы подгружаю из dll. Встала задача переключиться на русские меню, а их 2 штуки. Одно (IDR_MAINFRAME) отображается, когда документ не загружен, а другое (IDR_DOCMENU), когда документ загружен. Переключение между языками выполняется из меню документа (т.е. активно IDR_DOCMENU). Обработчик находится в... http://www.cyberforum.ru/cpp-beginners/thread496316.html
C++ WinAPI Как узнать родителя, породившего процесс, с помощью WinAPI?
Столкнулся с поблемой: Проблема следующая- не знаю яз. Си но хочу написать функцию на Си для Java (JNI - JAVA NATIVE INTERFACE) чтобы она показывала родительский процесс запустившего мою Java-программу (к примеру получить: Started by explorer.exe). OS: Win2k Java по всей видимости такого не умеет- поэтому буду ковырять Си. Может у кого есть готовые решения- буду рад их заполучить....
Получение из другой формы ТStringList C++
Не знаю куда это больше подходит, но появилась необходимость из Form2 получить доступ к ТStringList *myList = new ТStringList(); находящемуся в Form1. Есть ли какая то простая возможность это сделать?
C++ Как мне вызвать GetGuiResources в консольном приложении VS6? http://www.cyberforum.ru/cpp-beginners/thread496060.html
Приветствую! Подскажите плиз, как мне вызвать GetGuiResources в консольном приложении VS6. Код: #include <windows.h> #include <winuser.h> HWND hWnd; DWORD dwProcID; HANDLE hProcess; DWORD dwGDI;
Visual C++ Как правильно создать ListControl в VisualC++7 используя MFC? Добрый день! Я хочу создать List control, вот код: // создаю List control void __ListCtrl::Create(CWnd *pParentWnd,const RECT& rcClient) { m_dwStyle = WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|/*LVS_SHAREIMAGELISTS| LVS_SHOWSELALWAYS|*/LVS_SINGLESEL; if(!m_ListCtrl.Create(m_dwStyle,rcClient,pParentWnd, AFX_IDW_PANE_FIRST)) TRACE0('Failed to create list control подробнее

Показать сообщение отдельно
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
14.06.2011, 14:16     Помогите правильно реализовать метод IEnumIDList::Next
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru