Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Drag-n-Drop ИЗ окна, работающего в другом потоке 
Author Message
MVV



PostPosted: Thu Oct 28, 2010 14:27    Post subject: Drag-n-Drop ИЗ окна, работающего в другом потоке Reply with quote

Жил я себе, не тужил, пока не возникла необходимость реализовать тривиальное перетаскивание файлов из моего окна в любое другое. Но каков был шок, когда я понял, что кроме как через дебри OLE это реализовать невозможно. И что надо нагородить не один огород, чтобы реализовать такую мелочь. И началось...

Когда моё окно работает в основном потоке, и в нем же была вызвана OleInitialize, все нормально - с этой частью задачи я вроде разобрался.

Но теперь мне нужно сделать, чтобы то же самое работало, если я перетаскиваю файлы из окна, которое создано в другом потоке. Если конкретно, мой плагин создает поток, в нем - окно, в котором есть SysListView32, и из него мне надо суметь сделать перетаскивание файлов в другие окна.

Насколько я успел понять, Microsoft вплоть до Windows 7 не удосужилась сделать OLE-подсистему многопоточной, поэтому работать с COM-объектами можно только в одном-единственном потоке приложения. И, разумеется, это не мой поток, так как тотал сам по себе тоже умеет перетаскивать файлы.

Я пробовал при перетаскивании посылать окну тотала сообщение, в хуке которого (хук создается из основного потока) формировать структуру DROPFILES, создавать IDataObject и инициировать перетаскивание, вызывая [SH]DoDragDrop, но ничего не получается - оба окна (мое и тотала) на вид подвисают, потом при наведении мыши на окно тотала оно отвисает, и функция [SH]DoDragDrop говорит, что "Объект успешно передан приложению". И никакого перетаскивания не возникает и в помине... При тупом сабклассинге окна (при переопределении оконной процедуры через SetWindowLong[Ptr]) эффект тот же. При умном, наверное, был бы таким же, но попытка сабклассить по-умному (через SetWindowSubclass) вообще рушит тотал.

Поделился бы кто идейкой - было бы весьма кстати. Idea
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group