pidl нужного итема из ShellView
От: Lapin Украина  
Дата: 03.09.03 09:13
Оценка:
Здравия желаю, тарищи....
Возникла проблема след. плана. В общем, есть ShellView созданный путем IShellFolder::CreateViewObject.....ну и дальше как положено. Требуется получить pidl заданного по индексу элемента из List-View со списком файлов (а если точнее то именно выделенного файла).
Подскажите как это можно сделать.

P.S. Через IFolderView::Item — не катит (Minimum operating systems — Windows XP ... bad... )
Спасибо за внимание...
Re: pidl нужного итема из ShellView
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.09.03 09:25
Оценка:
Здравствуйте, Lapin, Вы писали:

L>Возникла проблема след. плана. В общем, есть ShellView созданный путем IShellFolder::CreateViewObject.....ну и дальше как положено. Требуется получить pidl заданного по индексу элемента из List-View со списком файлов (а если точнее то именно выделенного файла).

L>Подскажите как это можно сделать.

Посмотри IShellView::GetItemObject
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: pidl нужного итема из ShellView
От: Lapin Украина  
Дата: 03.09.03 10:07
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Посмотри IShellView::GetItemObject


В принципе смотрел уже:

Получил объект IDataObject вызывая IShellView::GetItemObject с параметром SVGIO_SELECTION
Все красиво, прямо прелестно но тут столкнулся с проблемой другого плана :
хотел извлечь из IDataObject все пидлы...получил список в формате CFSTR_SHELLIDLIST
А вот тут собсно и проблема :
Эту всю радость надо наваять в Delphi ....
и макрос

#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])

тупо не могу перевести на 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;
Спасибо за внимание...
Re[3]: pidl нужного итема из ShellView
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.09.03 10:26
Оценка:
Здравствуйте, 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 позиции.

HRESULT CF_IDList_Extractor::Extract(IDataObject* pDataObject)
{
 Flush();

 if(pDataObject==NULL)
  return m_extract_hr=E_FAIL;

 TFormatetc fc(CF_IDLIST,DVASPECT_CONTENT,TYMED_HGLOBAL);//Поддерживаемый формат данных

 if((m_extract_hr=pDataObject->QueryGetData(&fc))!=S_OK)
  return m_extract_hr;

 HRESULT hr;

 _OLE_TRY_
 {
  STGMEDIUM StgMedium;

  hr=pDataObject->GetData(&fc,&StgMedium);

  if(hr==NOERROR)
  {
   //Данные формата CF_IDLIST получены -----------------------------------------
   CIDA* data=(CIDA*)::GlobalLock(StgMedium.hGlobal);
   
   if(data==NULL || data->cidl<1)
    hr=E_FAIL;
   else
   for(UINT i=0;i<=data->cidl;i++)
   {
    if(i==0)
     m_root_id_list.set(LPCITEMIDLIST(reinterpret_cast<char*>(data)+data->aoffset[i]));
    else
     m_list.Add(LPCITEMIDLIST(reinterpret_cast<char*>(data)+data->aoffset[i]));
   }

   if(data!=NULL)
    ::GlobalUnlock(StgMedium.hGlobal);

   ::ReleaseStgMedium(&StgMedium);
  }
 }_OLE_CATCHES_

 return m_extract_hr=hr;
}
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: pidl нужного итема из ShellView
От: Lapin Украина  
Дата: 03.09.03 10:48
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Не, с паскалем парься сам. Я его уже благополучно забыл


Да вот и парюсь, блин. Везучий ты... а вот мне не дают забыть. Вот так и перевожу всю жизнь код то с паскаля на си, то з си на паскаль

КД>Насчет вытаскивания pidl из IDataObject нашел у себя вот такой код


Спасибо огромное!!!

КД>Обрати внимание, что в нулевом элементе хранится pidl охватывающей папки, а сами элементы идут начиная с 1 позиции.


Да в принципе я в курсе, в коде это просто я для примера пидл родительской папки взял...
Нужен действительно пидл по индексу ....
Спасибо за внимание...
Re[4]: pidl нужного итема из ShellView
От: NiJazz Австралия  
Дата: 17.02.06 16:17
Оценка:
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 позиции.


КД>
КД>HRESULT CF_IDList_Extractor::Extract(IDataObject* pDataObject)
КД>{
КД> Flush();

КД> if(pDataObject==NULL)
КД>  return m_extract_hr=E_FAIL;

КД> TFormatetc fc(CF_IDLIST,DVASPECT_CONTENT,TYMED_HGLOBAL);//Поддерживаемый формат данных

КД> if((m_extract_hr=pDataObject->QueryGetData(&fc))!=S_OK)
КД>  return m_extract_hr;

КД> HRESULT hr;

КД> _OLE_TRY_
КД> {
КД>  STGMEDIUM StgMedium;

КД>  hr=pDataObject->GetData(&fc,&StgMedium);

КД>  if(hr==NOERROR)
КД>  {
КД>   //Данные формата CF_IDLIST получены -----------------------------------------
КД>   CIDA* data=(CIDA*)::GlobalLock(StgMedium.hGlobal);
   
КД>   if(data==NULL || data->cidl<1)
КД>    hr=E_FAIL;
КД>   else
КД>   for(UINT i=0;i<=data->cidl;i++)
КД>   {
КД>    if(i==0)
КД>     m_root_id_list.set(LPCITEMIDLIST(reinterpret_cast<char*>(data)+data->aoffset[i]));
КД>    else
КД>     m_list.Add(LPCITEMIDLIST(reinterpret_cast<char*>(data)+data->aoffset[i]));
КД>   }

КД>   if(data!=NULL)
КД>    ::GlobalUnlock(StgMedium.hGlobal);

КД>   ::ReleaseStgMedium(&StgMedium);
КД>  }
КД> }_OLE_CATCHES_

КД> return m_extract_hr=hr;
КД>}
КД>
Re[5]: pidl нужного итема из ShellView
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 17.02.06 16:54
Оценка:
Здравствуйте, NiJazz, Вы писали:

NJ>m_root_id_list и m_list — какого они типа?

NJ>CF_IDLIST — откуда вы взяли такую константу?
NJ>Спасибо.

const CLIPFORMAT CF_IDLIST          =(CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLIST);
const CLIPFORMAT CF_OBJECTPOSITIONS =(CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLISTOFFSET);

см. <shlobj.h>

m_root_id_list, m_list — это объекты моего класса-обертки для ITEMIDLIST
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[6]: pidl нужного итема из ShellView
От: NiJazz Австралия  
Дата: 17.02.06 16:58
Оценка:
ОК. Вы могли показать код методов Add и Set? Спасибо.

Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, NiJazz, Вы писали:


NJ>>m_root_id_list и m_list — какого они типа?

NJ>>CF_IDLIST — откуда вы взяли такую константу?
NJ>>Спасибо.

КД>
КД>const CLIPFORMAT CF_IDLIST          =(CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLIST);
КД>const CLIPFORMAT CF_OBJECTPOSITIONS =(CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLISTOFFSET);
КД>

КД>см. <shlobj.h>

КД>m_root_id_list, m_list — это объекты моего класса-обертки для ITEMIDLIST
Re[7]: pidl нужного итема из ShellView
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 17.02.06 17:10
Оценка:
Здравствуйте, NiJazz, Вы писали:

NJ>ОК. Вы могли показать код методов Add и Set? Спасибо.


Тут оказалось, что насчет m_list я тебя немного обманул

Считай, что это std::vector, а Add — std::vector::push_back

Исходники как самой обертки так и приведенного кода можешь посмотреть здесь

Прошу за качество не материть. Они из моего темного детства
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[8]: pidl нужного итема из ShellView
От: NiJazz Австралия  
Дата: 17.02.06 17:15
Оценка:
Спасибо. =) Буду разбираться.

Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, NiJazz, Вы писали:


NJ>>ОК. Вы могли показать код методов Add и Set? Спасибо.


КД>Тут оказалось, что насчет m_list я тебя немного обманул


КД>Считай, что это std::vector, а Add — std::vector::push_back


КД>Исходники как самой обертки так и приведенного кода можешь посмотреть здесь


КД>Прошу за качество не материть. Они из моего темного детства
Re[8]: pidl нужного итема из ShellView
От: NiJazz Австралия  
Дата: 18.02.06 11:37
Оценка:
А какой вектор? vector<BYTE> ?

Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, NiJazz, Вы писали:


NJ>>ОК. Вы могли показать код методов Add и Set? Спасибо.


КД>Тут оказалось, что насчет m_list я тебя немного обманул


КД>Считай, что это std::vector, а Add — std::vector::push_back


КД>Исходники как самой обертки так и приведенного кода можешь посмотреть здесь


КД>Прошу за качество не материть. Они из моего темного детства
Re[9]: pidl нужного итема из ShellView
От: NiJazz Австралия  
Дата: 18.02.06 11:44
Оценка:
Прошу прощения, я совсем забыл, что у меня есть исходники. =)

Здравствуйте, NiJazz, Вы писали:

NJ>А какой вектор? vector<BYTE> ?


NJ>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Здравствуйте, NiJazz, Вы писали:


NJ>>>ОК. Вы могли показать код методов Add и Set? Спасибо.


КД>>Тут оказалось, что насчет m_list я тебя немного обманул


КД>>Считай, что это std::vector, а Add — std::vector::push_back


КД>>Исходники как самой обертки так и приведенного кода можешь посмотреть здесь


КД>>Прошу за качество не материть. Они из моего темного детства
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.