Название: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 21, 2014, 14:36 Добрый день!
Проблема: нужно работать с COM-объектом в многопоточной среде. COM обёрнут QAxObject. В консольном приложении (QCoreApplication) всё хорошо, но при создании QApplication, начинается беда. Дело в том, что в конструкторе QApplication происходит вызов OleInitialize(NULL), а он за собой тянет вызов CoInitializeEx(NULL, COINIT_APARTMENTTHREADED), и в этом случае из других потоков доступа к COM нет :-( Если после создания QApplication, переинициализировать COM: CoUninitialize(); CoInitializeEx( NULL, COINIT_MULTITHREADED ); то перестают вызываться QFileDialog, например... и вообще много, что перестаёт работать. Сталкивался ли кто с данной проблемой и существует ли её решение? Название: Re: Работа с COM в MTA и QApplication Отправлено: Johnik от Октябрь 21, 2014, 23:23 какая ось?
Название: Re: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 22, 2014, 07:41 какая ось? не принципиально, думаю, что как на NT 5.1 так и на NT 6.3 будет одинаково...Название: Re: Работа с COM в MTA и QApplication Отправлено: Johnik от Октябрь 22, 2014, 08:13 думаю, что как на NT 5.1 так и на NT 6.3 будет одинаково... проверяли?Работа COM подсистемы во многом отличается в XP с системами выше, в некоторых случаях это связано с DEP. Название: Re: Работа с COM в MTA и QApplication Отправлено: Old от Октябрь 22, 2014, 08:20 Сталкивался ли кто с данной проблемой и существует ли её решение? Попробуйте в других нитках, где будете работать с COM-объектами, в начале выполнять CoInitializeEx( NULL, COINIT_MULTITHREADED ).Название: Re: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 22, 2014, 08:37 Попробуйте в других нитках, где будете работать с COM-объектами, в начале выполнять CoInitializeEx( NULL, COINIT_MULTITHREADED ). Пробовал, нет доступа. :-(У меня объект существует ещё до создания потоков... и маршалить его ручками в поток не очень хочется... проверяли? на XP не проверял, только win7 и 2008r2, одинаково... :-(Название: Re: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 22, 2014, 08:45 Единственное, что придумал, это городить два приложения QApplication (UI и логика) и QCoreAplication (обёртка COM), связанные между собой, например, по xml-rpc. (((
Название: Re: Работа с COM в MTA и QApplication Отправлено: Old от Октябрь 22, 2014, 08:46 Пробовал, нет доступа. :-( Да, объекты должны создаваться в самом потоке после вызова инициализации.У меня объект существует ещё до создания потоков... и маршалить его ручками в поток не очень хочется... А в чем проблема перенести его в отдельный поток. Можно сделать класс-враппер, куда спрятать всю работу с COM. Название: Re: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 22, 2014, 09:02 Можно сделать класс-враппер, куда спрятать всю работу с COM. Так и работаюА в чем проблема перенести его в отдельный поток. Есть такой вариант http://www.k-press.ru/cs/2000/4/com_htm/com_1.asp (параграф: "Клиентское приложение 2 – входим в многопоточный мир")Есть ли материал как это сделать менее болезненно? Средствами Qt а не WinApi? Название: Re: Работа с COM в MTA и QApplication Отправлено: Johnik от Октябрь 22, 2014, 09:06 Thread Support in Qt (http://qt-project.org/doc/qt-4.8/threads.html)
Название: Re: Работа с COM в MTA и QApplication Отправлено: Old от Октябрь 22, 2014, 09:12 Так и работаю С отдельным потоком внутри? Я вам предлагаю сделать класс, который будет запускать отдельный поток, инициализировать COM, создавать там нужные объекты и их обслуживать.Название: Re: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 22, 2014, 10:09 С отдельным потоком внутри? Я вам предлагаю сделать класс, который будет запускать отдельный поток, инициализировать COM, создавать там нужные объекты и их обслуживать. Такой вариант мне не подходит, т.к. необходимо выполнять работу с COM параллельно (внутри COM обеспечена потокобезопасность)Название: Re: Работа с COM в MTA и QApplication Отправлено: Johnik от Октябрь 22, 2014, 10:20 В потоке это и есть параллельно.
Второй вариант: попробуйте отключить DEP. Мне помогло. Код: bcdedit.exe /set {current} nx AlwaysOff Название: Re: Работа с COM в MTA и QApplication Отправлено: Dolu от Октябрь 22, 2014, 10:31 В потоке это и есть параллельно. Имелось ввиду работа с одним COM в нескольких потоках конечно. |