а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ?
В МСДН мало и не совсем то.
Да, это еще и под Windows CE 3.0 aka PocketPC, там CF_HDROP нету...
Здравствуйте 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 у меня работает :)
Здравствуйте 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'ы, но как?
Здравствуйте 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'ы, но как? >
Суть действий примерно такова:
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. Ну а теперь делай с файлами что хочешь.
Здравствуйте, ole, Вы писали:
ole>а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ? ole>В МСДН мало и не совсем то. ole>Да, это еще и под Windows CE 3.0 aka PocketPC, там CF_HDROP нету...
Привет! Получилось что-нибудь? Как раз занимась любовью с буфером обмена в WinCE ILCreateFromPath нету, ILCreate,ILCombine нету. Непонятно с какого конца к этим пидлам подойти.
Здравствуйте, ole, Вы писали:
ole>а знает ли кто здесь, как вытянуть пути к файлам, которые были затянуты в буффер обмена Проводником Виндоуз, в формате "Shell IDList Array" ?
См. описание CIDA. Там все просто: количество элементов, массив смещений и pidl'ы:
Здравствуйте, Alex-Z, Вы писали:
AZ>... Как раз занимась любовью с буфером обмена в WinCE ILCreateFromPath нету, ILCreate,ILCombine нету. Непонятно с какого конца к этим пидлам подойти.
ILCreateFromPath реализуется через связку SHGetDesktopFolder + IShellFolder::ParseDisplayName
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*... Ничего хорошего из этого не получится.