Здравия желаю, тарищи....
Возникла проблема след. плана. В общем, есть ShellView созданный путем IShellFolder::CreateViewObject.....ну и дальше как положено. Требуется получить pidl заданного по индексу элемента из List-View со списком файлов (а если точнее то именно выделенного файла).
Подскажите как это можно сделать.
P.S. Через IFolderView::Item — не катит (Minimum operating systems — Windows XP ... bad... )
Здравствуйте, Lapin, Вы писали:
L>Возникла проблема след. плана. В общем, есть ShellView созданный путем IShellFolder::CreateViewObject.....ну и дальше как положено. Требуется получить pidl заданного по индексу элемента из List-View со списком файлов (а если точнее то именно выделенного файла). L>Подскажите как это можно сделать.
Посмотри IShellView::GetItemObject
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Посмотри IShellView::GetItemObject
В принципе смотрел уже:
Получил объект IDataObject вызывая IShellView::GetItemObject с параметром SVGIO_SELECTION
Все красиво, прямо прелестно но тут столкнулся с проблемой другого плана :
хотел извлечь из IDataObject все пидлы...получил список в формате CFSTR_SHELLIDLIST
А вот тут собсно и проблема :
Эту всю радость надо наваять в Delphi ....
и макрос
тупо не могу перевести на Pascal (
ужастно стыдно, но не могу....
если можешь помоги, плиз
делаю все так
if Succeeded(FShellView.GetItemObject(SVGIO_SELECTION,IID_IDataObject,pData)) then
begin
FillChar(fmt,sizeof(fmt),0);
fmt.cfFormat := RegisterClipboardFormat(CFSTR_SHELLIDLIST);
fmt.ptd := 0;
fmt.dwAspect := DVASPECT_CONTENT;
fmt.lindex := -1;
fmt.tymed := TYMED_HGLOBAL;
if Succeeded(IDataObject(pData).GetData(fmt,data)) then
begin
list := GlobalLock(data.hGlobal);
// Вот эта строчка и не катит
pidl := PItemIDList(pointer(cardinal(@list)+list.aoffset[0]));
end;
end;
Здравствуйте, Lapin, Вы писали:
L>#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1]) L>тупо не могу перевести на Pascal (
L>if Succeeded(FShellView.GetItemObject(SVGIO_SELECTION,IID_IDataObject,pData)) then L>begin L> FillChar(fmt,sizeof(fmt),0); L> fmt.cfFormat := RegisterClipboardFormat(CFSTR_SHELLIDLIST); L> fmt.ptd := 0; L> fmt.dwAspect := DVASPECT_CONTENT; L> fmt.lindex := -1; L> fmt.tymed := TYMED_HGLOBAL; L> if Succeeded(IDataObject(pData).GetData(fmt,data)) then L> begin L> list := GlobalLock(data.hGlobal); L>// Вот эта строчка и не катит L> pidl := PItemIDList(pointer(cardinal(@list)+list.aoffset[0])); L> end; L>end;
Не, с паскалем парься сам. Я его уже благополучно забыл
Насчет вытаскивания pidl из IDataObject нашел у себя вот такой код
Обрати внимание, что в нулевом элементе хранится pidl охватывающей папки, а сами элементы идут начиная с 1 позиции.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Не, с паскалем парься сам. Я его уже благополучно забыл
Да вот и парюсь, блин. Везучий ты... а вот мне не дают забыть. Вот так и перевожу всю жизнь код то с паскаля на си, то з си на паскаль
КД>Насчет вытаскивания pidl из IDataObject нашел у себя вот такой код
Спасибо огромное!!!
КД>Обрати внимание, что в нулевом элементе хранится pidl охватывающей папки, а сами элементы идут начиная с 1 позиции.
Да в принципе я в курсе, в коде это просто я для примера пидл родительской папки взял...
Нужен действительно пидл по индексу ....
m_root_id_list и m_list — какого они типа?
CF_IDLIST — откуда вы взяли такую константу?
Спасибо.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, Lapin, Вы писали:
L>>#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1]) L>>тупо не могу перевести на Pascal (
L>>if Succeeded(FShellView.GetItemObject(SVGIO_SELECTION,IID_IDataObject,pData)) then L>>begin L>> FillChar(fmt,sizeof(fmt),0); L>> fmt.cfFormat := RegisterClipboardFormat(CFSTR_SHELLIDLIST); L>> fmt.ptd := 0; L>> fmt.dwAspect := DVASPECT_CONTENT; L>> fmt.lindex := -1; L>> fmt.tymed := TYMED_HGLOBAL; L>> if Succeeded(IDataObject(pData).GetData(fmt,data)) then L>> begin L>> list := GlobalLock(data.hGlobal); L>>// Вот эта строчка и не катит L>> pidl := PItemIDList(pointer(cardinal(@list)+list.aoffset[0])); L>> end; L>>end;
КД>Не, с паскалем парься сам. Я его уже благополучно забыл КД>Насчет вытаскивания pidl из IDataObject нашел у себя вот такой код
КД>Обрати внимание, что в нулевом элементе хранится pidl охватывающей папки, а сами элементы идут начиная с 1 позиции.
КД>
ОК. Вы могли показать код методов Add и Set? Спасибо.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, NiJazz, Вы писали:
NJ>>m_root_id_list и m_list — какого они типа? NJ>>CF_IDLIST — откуда вы взяли такую константу? NJ>>Спасибо.
КД>
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, NiJazz, Вы писали:
NJ>>ОК. Вы могли показать код методов Add и Set? Спасибо.
КД>Тут оказалось, что насчет m_list я тебя немного обманул
КД>Считай, что это std::vector, а Add — std::vector::push_back
КД>Исходники как самой обертки так и приведенного кода можешь посмотреть здесь
КД>Прошу за качество не материть. Они из моего темного детства
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, NiJazz, Вы писали:
NJ>>ОК. Вы могли показать код методов Add и Set? Спасибо.
КД>Тут оказалось, что насчет m_list я тебя немного обманул
КД>Считай, что это std::vector, а Add — std::vector::push_back
КД>Исходники как самой обертки так и приведенного кода можешь посмотреть здесь
КД>Прошу за качество не материть. Они из моего темного детства
Прошу прощения, я совсем забыл, что у меня есть исходники. =)
Здравствуйте, NiJazz, Вы писали:
NJ>А какой вектор? vector<BYTE> ?
NJ>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Здравствуйте, NiJazz, Вы писали:
NJ>>>ОК. Вы могли показать код методов Add и Set? Спасибо.
КД>>Тут оказалось, что насчет m_list я тебя немного обманул
КД>>Считай, что это std::vector, а Add — std::vector::push_back
КД>>Исходники как самой обертки так и приведенного кода можешь посмотреть здесь
КД>>Прошу за качество не материть. Они из моего темного детства