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 

Drag-n-Drop ИЗ окна, работающего в другом потоке

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: 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…
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Sat Mar 26, 2011 18:26    Post subject: Reply with quote

Н-да, все оказалось так просто - тупо вызывать OleInitialize из каждого потока, в котором нужно использовать dnd, игнорируя все сказания об однопоточности модели OLE. И всё нормально работает безо всяких извращений.

Попутно возникла и была решена другая проблема - вызов OleUninitialize во время завершения приложения может завесить его или вызвать кучу других ошибок - поэтому нужно избегать вызовов OleUninitialize, когда один из потоков выполняет код функции DllMain (например, такая ситуация возникает, если основной поток закрывается и экстренно приказывает фоновым завершить работу). Собственно, об этом написано в MSDN, хотя и не так подробно.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group