Добрый день.
Мне требуется реализовать drag-drop из своей программы в Explorer с созданием соответствующих файлов. С простыми файлами я разобрался и вроде все работает. Я реализую форматы CFSTR_FILEGROUPDESCRIPTOR и CFSTR_FILECONTENTS с содержимым файла.
Теперь надо сделать то же самое, но чтобы создавалась структура каталогов (предполагается, что в моей программе есть иерархическая структура, которую я могу отобразить на структуру каталогов). Мне посоветовали в FILEDESCRIPTOR класть не просто имя файла, а относительный путь со всей цепочкой каталогов. И это в общем работает (действительно создаются все каталоги), но есть проблема. Почему-то созданные каталоги потом невозможно удалить (sharing violation). Причем даже после выхода из всех приложений. Что тут может быть не так? Или вообще это надо делать по-другому?
Спасибо
Здравствуйте Андрей Тимошенков, Вы писали:
АТ>Добрый день.
АТ>Мне требуется реализовать 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 положи полный путь. Ето к тому как можно сделать по-другому.
Относительно твоей проблемы, хотелось бы помотреть код, ибо не совсем понятно.
Здравствуйте 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