Drag & Drop файлов из CListControl
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Здравствуйте, не подскажете как решить следующую проблему?
В CListControl есть список файлов, после события LVN_BEGINDRAG инициалищируется COleDataSource, далее устанавливаеются все параметры и в конце вызывается Datasrc.DoDragDrop(DROPEFFECT_COPY).
Все работает нормально, но когда файл большой (фильм к примеру) то окно приложения не реагирует ни на что пока файл не скопируется, или пока юзер не отменит операцию копирования. Как быть?
Я пробовал запускать DoDragDrop в отдельном потоке, так там даже сама операция перетаскивания не начинается.
В CListControl есть список файлов, после события LVN_BEGINDRAG инициалищируется COleDataSource, далее устанавливаеются все параметры и в конце вызывается Datasrc.DoDragDrop(DROPEFFECT_COPY).
Все работает нормально, но когда файл большой (фильм к примеру) то окно приложения не реагирует ни на что пока файл не скопируется, или пока юзер не отменит операцию копирования. Как быть?
Я пробовал запускать DoDragDrop в отдельном потоке, так там даже сама операция перетаскивания не начинается.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Плохо значит пытался. Отдщельная thread'а - это действительно один из самых частоиспользуемых путей для решения подобной проблемы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Пример кода запуска операции DragDrop из CListCtrl в студию, плиз!
З.Ы. только рабочего
А с потоками я нормально могу работать, не в этом дело, просто по-моему OLE не работает из отдельного потока.
З.Ы. только рабочего

А с потоками я нормально могу работать, не в этом дело, просто по-моему OLE не работает из отдельного потока.
Romeo писал(а):Плохо значит пытался. Отдщельная thread'а - это действительно один из самых частоиспользуемых путей для решения подобной проблемы.
Примеры есть кстати и в MSDN. Но лучше на http://www.codeguru.com - в частности вот тут. См. раздел Drag & Drop.Пример кода запуска операции DragDrop из CListCtrl в студию, плиз!
*provided AS IS
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Прикольно, а OleInitialize не пробовал делать?subver писал(а): ...по-моему OLE не работает из отдельного потока...

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
[quote=""Romeo
Прикольно, а OleInitialize не пробовал делать?
[/quote"]
Не, вы че меня совсем за дурака держите? Я же объяснил что все работает и единственная проблема - это блокирование основного потока при перетаскивании большого файла.
Я наткнулся на описание IAsyncOperation - вроде то, что надо, но не получается прикрутить к IDataObject. Експлорер запрашивает интерфейс IID_IAsyncOperation, я ему возвращаю указатель на мой объект DataObject, но после этого эксплорер не вызывает почему-то IAsyncOperation::GetAsyncMode() моего DataObject и начинает копирвоать файл как и раньше, где грабли?
Прикольно, а OleInitialize не пробовал делать?

Не, вы че меня совсем за дурака держите? Я же объяснил что все работает и единственная проблема - это блокирование основного потока при перетаскивании большого файла.
Я наткнулся на описание IAsyncOperation - вроде то, что надо, но не получается прикрутить к IDataObject. Експлорер запрашивает интерфейс IID_IAsyncOperation, я ему возвращаю указатель на мой объект DataObject, но после этого эксплорер не вызывает почему-то IAsyncOperation::GetAsyncMode() моего DataObject и начинает копирвоать файл как и раньше, где грабли?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Значит твой отимплименченный QueryInterface не поддерживает IID_IAsyncOperation идентификатор. Как следствие IE, вызывая этот метод, получает E_NOIMPLENT и всё падает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Вот кусок из QueryInterface моего DataObject'a:Romeo писал(а):Значит твой отимплименченный QueryInterface не поддерживает IID_IAsyncOperation идентификатор. Как следствие IE, вызывая этот метод, получает E_NOIMPLENT и всё падает.
Код: Выделить всё
if(]
При отладке дебаггер проваливается в (1), выполняется (2) и все :(
дальше ничего не происходит и Explorer копирует файл в обычном режиме.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Не могу сказать что здесь не так. Слишком мало информации.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Может есть идеи как сделать копирование файла вручную, после того как юзер скинет его куда ему там надо?Romeo писал(а):Не могу сказать что здесь не так. Слишком мало информации.