Q: IDataObject
От: ole  
Дата: 24.04.01 13:31
Оценка:
Здравствуйте!

а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ?
В МСДН мало и не совсем то.
Да, это еще и под Windows CE 3.0 aka PocketPC, там CF_HDROP нету...

Буду очч благодарен за ответ
Re: Q: IDataObject
От: Edward Россия  
Дата: 25.04.01 07:42
Оценка:
Здравствуйте ole, 24.04.2001 07:31:33 вы писали:

>Здравствуйте!

>
>а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ?
>В МСДН мало и не совсем то.
>Да, это еще и под Windows CE 3.0 aka PocketPC, там CF_HDROP нету...
>
>Буду очч благодарен за ответ

Вытягиваешь этот "Shell IDList Array", потом поле hGlobal в структуре STGMEDIUM приводишь к HDROP и запихиваешь в функцию DragQueryFile.
(UINT i = DragQueryFile( ( HDROP )stg.hGlobal, ( UINT )-1, NULL, 0 ); что-то вроде этого)
Под Win CE и PocketPC не знаю, а под 98 у меня работает :)
Re[2]: Q: IDataObject
От: ole  
Дата: 25.04.01 08:24
Оценка:
Здравствуйте Edward, 25.04.2001 01:42:11 вы писали:

>

>Вытягиваешь этот "Shell IDList Array", потом поле hGlobal в структуре STGMEDIUM приводишь к HDROP и запихиваешь в функцию DragQueryFile.
>(UINT i = DragQueryFile( ( HDROP )stg.hGlobal, ( UINT )-1, NULL, 0 ); что-то вроде этого)
>Под Win CE и PocketPC не знаю, а под 98 у меня работает :)

Спасибо за ответ!
очень полезно узнать, что CIDA можно приводить к HDROP, но все же, это мне не подошло, под CE нету DragQueryFile, именно функциональность этой функции мне и нужна, но в своем коде...
Я так понимаю, DragQueryFile получает хэндл на массив IDL и парсит его, получает количество и сами IDL'ы, но как?
Re[3]: Q: IDataObject
От: Edward Россия  
Дата: 25.04.01 10:49
Оценка:
Здравствуйте ole, 25.04.2001 02:24:43 вы писали:

>Здравствуйте Edward, 25.04.2001 01:42:11 вы писали:

>
>>
>>Вытягиваешь этот "Shell IDList Array", потом поле hGlobal в структуре STGMEDIUM приводишь к HDROP и запихиваешь в функцию DragQueryFile.
>>(UINT i = DragQueryFile( ( HDROP )stg.hGlobal, ( UINT )-1, NULL, 0 ); что-то вроде этого)
>>Под Win CE и PocketPC не знаю, а под 98 у меня работает :)
>
>Спасибо за ответ!
>очень полезно узнать, что CIDA можно приводить к HDROP, но все же, это мне не подошло, под CE нету DragQueryFile, именно функциональность этой функции мне и нужна, но в своем коде...
>Я так понимаю, DragQueryFile получает хэндл на массив IDL и парсит его, получает количество и сами IDL'ы, но как?
>

Тогда посмотри IShellFolder::GetDisplayNameOf
конкретно с IShellFolder я не работал, но работал с Shell интерфейсами, в MSDN достаточно много написано про SIDA. А так же посмотри ссылку
mk:@MSITStore:D:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2000OCT\1033\Shellcc.chm:/shellcc/Shell/Shell_basics/Namespace.htm#ids (только путь поправь :) ) в MSDN.

Прошу прощения за неполный ответ, но надеюсь это поможет.
Re: Q: IDataObject
От: OlegO Россия http://www.mediachase.ru
Дата: 30.04.01 08:08
Оценка:
Здравствуй.

Суть действий примерно такова:
1. у интерфейса IDataObject через метод GetData запрашиваешь данные
cfFormat = CF_HDROP (число 15) && tymed = TYMED_HGLOBAL
2. Тебе вернется указатель на HGLOBAL
он указывает на структуру DROPFILES
typedef struct _DROPFILES {
DWORD pFiles;
POINT pt;
BOOL fNC;
BOOL fWide;
} DROPFILES, FAR * LPDROPFILES;
что тебе надо так это параметр pFiles — Отступ от начала структуры до начала
листа файлов.
(pDropStruct+pFiles) — это указатель на начла листа файлов следующего вида
<имя1>\0<имя2>\0...\0<имяN>\0\0
идут пути к файлам разделенные нулевым символом и заканчивается двумя нулевыми
символами. Вроде просто :)
3. Ну а теперь делай с файлами что хочешь.

С уважением Олег. Удачи.
С уважением, OlegO.
Re: Q: IDataObject
От: Alex-Z  
Дата: 08.04.08 07:41
Оценка:
Здравствуйте, ole, Вы писали:

ole>а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ?

ole>В МСДН мало и не совсем то.
ole>Да, это еще и под Windows CE 3.0 aka PocketPC, там CF_HDROP нету...


Привет! Получилось что-нибудь? Как раз занимась любовью с буфером обмена в WinCE ILCreateFromPath нету, ILCreate,ILCombine нету. Непонятно с какого конца к этим пидлам подойти.
Re[3]: Q: IDataObject
От: Юрий Жмеренецкий ICQ 380412032
Дата: 08.04.08 10:38
Оценка:
Здравствуйте, ole, Вы писали:

ole>а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ?


См. описание CIDA. Там все просто: количество элементов, массив смещений и pidl'ы:
#define HIDA_GetPIDLFolder(pida) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[0])
#define HIDA_GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])

/*...*/
FORMATETC fmt = {RegisterClipboardFormat(CFSTR_SHELLIDLIST),
  NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };

STGMEDIUM stg = {TYMED_HGLOBAL};
    
if(FAILED(pDataObj->GetData(&fmt, &stg)))
  return E_INVALIDARG;

CIDA* cida = (CIDA*) GlobalLock(stg.hGlobal);
cida->cidl; // количество pidl'ов
LPCITEMIDLIST pf = HIDA_GetPIDLFolder(cida); // pidl объемлющей папки
LPCITEMIDLIST pi = HIDA_GetPIDLItem(cida, i); // i-й pidl. relative.
/*...*/
GlobalUnlock (stg.hGlobal);
ReleaseStgMedium(&stg);

По pidl'ам пути получить, я думаю, не проблема.
Re[2]: Q: IDataObject
От: Юрий Жмеренецкий ICQ 380412032
Дата: 08.04.08 11:09
Оценка:
Здравствуйте, Alex-Z, Вы писали:

AZ>... Как раз занимась любовью с буфером обмена в WinCE ILCreateFromPath нету, ILCreate,ILCombine нету. Непонятно с какого конца к этим пидлам подойти.


ILCreateFromPath реализуется через связку SHGetDesktopFolder + IShellFolder::ParseDisplayName
LPITEMIDLIST ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
  UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);
  UINT cb2 = ILGetSize(pidl2);

  LPITEMIDLIST pidlNew = (LPITEMIDLIST)::CoTaskMemAlloc(cb1 + cb2);
  if(!pidlNew)
    throw std::bad_alloc(); // Или по другому

  ::CopyMemory(pidlNew, pidl1, cb1);
  ::CopyMemory(((LPSTR)pidlNew) + cb1, pidl2, cb2);
  
  return pidlNew;
}

А ILCreate то Вам зачем ?
Re[2]: Q: IDataObject
От: Юрий Жмеренецкий ICQ 380412032
Дата: 08.04.08 12:33
Оценка:
Здравствуйте, Edward, Вы писали:


E>Вытягиваешь этот "Shell IDList Array", потом поле hGlobal в структуре STGMEDIUM приводишь к HDROP и запихиваешь в функцию DragQueryFile.

E>(UINT i = DragQueryFile( ( HDROP )stg.hGlobal, ( UINT )-1, NULL, 0 ); что-то вроде этого)
E>Под Win CE и PocketPC не знаю, а под 98 у меня работает

Одно из двух: либо это не CFSTR_SHELLIDLIST, либо это не работает.
// CF_HDROP: ... The structure's hGlobal member points to a DROPFILES structure as its hGlobal member.
typedef struct _DROPFILES {
    DWORD pFiles;
    POINT pt;
    BOOL fNC;
    BOOL fWide;
} DROPFILES;

//CFSTR_SHELLIDLIST: ...The structure's hGlobal member points to a CIDA structure.
typedef struct _IDA {
    UINT cidl;
    UINT aoffset[1];
} CIDA, *LPIDA;

Записали как CIDA*, а читаем как DROPFILES*... Ничего хорошего из этого не получится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.