Drag-drop into the shell
От: Андрей Тимошенков Россия  
Дата: 18.10.02 14:35
Оценка:
Добрый день.

Мне требуется реализовать drag-drop из своей программы в Explorer с созданием соответствующих файлов. С простыми файлами я разобрался и вроде все работает. Я реализую форматы CFSTR_FILEGROUPDESCRIPTOR и CFSTR_FILECONTENTS с содержимым файла.

Теперь надо сделать то же самое, но чтобы создавалась структура каталогов (предполагается, что в моей программе есть иерархическая структура, которую я могу отобразить на структуру каталогов). Мне посоветовали в FILEDESCRIPTOR класть не просто имя файла, а относительный путь со всей цепочкой каталогов. И это в общем работает (действительно создаются все каталоги), но есть проблема. Почему-то созданные каталоги потом невозможно удалить (sharing violation). Причем даже после выхода из всех приложений. Что тут может быть не так? Или вообще это надо делать по-другому?

Спасибо
Re: Drag-drop into the shell
От: Patalog Россия  
Дата: 19.10.02 09:26
Оценка:
Здравствуйте Андрей Тимошенков, Вы писали:

АТ>Добрый день.


АТ>Мне требуется реализовать drag-drop из своей программы в Explorer с созданием соответствующих файлов. С простыми файлами я разобрался и вроде все работает. Я реализую форматы CFSTR_FILEGROUPDESCRIPTOR и CFSTR_FILECONTENTS с содержимым файла.


АТ>Теперь надо сделать то же самое, но чтобы создавалась структура каталогов (предполагается, что в моей программе есть иерархическая структура, которую я могу отобразить на структуру каталогов). Мне посоветовали в FILEDESCRIPTOR класть не просто имя файла, а относительный путь со всей цепочкой каталогов. И это в общем работает (действительно создаются все каталоги), но есть проблема. Почему-то созданные каталоги потом невозможно удалить (sharing violation). Причем даже после выхода из всех приложений. Что тут может быть не так? Или вообще это надо делать по-другому?


Посмотри http://www.rsdn.ru/Forum/Message.aspx?mid=27889&only=1
Автор: Patalog
Дата: 11.02.02

В Dropping data положи полный путь. Ето к тому как можно сделать по-другому.
Относительно твоей проблемы, хотелось бы помотреть код, ибо не совсем понятно.
Почетный кавалер ордена Совка.
Re[2]: Drag-drop into the shell
От: Андрей Тимошенков Россия  
Дата: 21.10.02 13:20
Оценка:
Здравствуйте Patalog, Вы писали:

P>Посмотри http://www.rsdn.ru/Forum/Message.aspx?mid=27889&only=1
Автор: Patalog
Дата: 11.02.02

P>В Dropping data положи полный путь. Ето к тому как можно сделать по-другому.
Нет, это не подходит. Может, я неясно объяснил, но через HDROP можно передать имена существующих файлов, а в моем случае файлов нет, а есть некие данные в приложении, которые должны быть превращены в файлы (и каталоги) при затаскивании в оболочку.

P>Относительно твоей проблемы, хотелось бы помотреть код, ибо не совсем понятно.

Код воспроизвести довольно сложно, т.к. его много. Вот некоторые куски:

// здесь строим блок памяти для CFSTR_FILEDESCRIPTOR
HGLOBAL hg = GlobalAlloc( GMEM_MOVEABLE, sizeof( FILEGROUPDESCRIPTOR ) );
FILEGROUPDESCRIPTOR * fgd = (FILEGROUPDESCRIPTOR*)GlobalLock( hg );
fgd->cItems = 1;
FILEDESCRIPTOR* fd = fgd->fgd;
fd->dwFlags = FD_ATTRIBUTES;
fd->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL;
strcpy( fd->cFileName, "Dir\\Subdir\\Filename.ext" );
GlobalUnlock( hg );

// здесь строим блок памяти для CFSTR_FILECONTENTS
HGLOBAL hg = GlobalAlloc( DATA_SIZE );
void* data = GlobalLock( hg );
CopyData( data ); // какие-то данные для файла
GlobalUnlock( hg );


Best regards,
Andrey
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.