Проблема с Com в EXE
От: Fors  
Дата: 07.12.04 15:10
Оценка:
Народ, у меня такая проблема. Есть приложение,в котором нужно создать ком-объекты, имплементирующие определенные интерфейсы. Эти объекты должны быть внутри exe-шника. Exe — SDI приложение. Делаю Insert ATL object, добавляю в проект поддержку ATL, создаю ком-объект. Все работает. Однако при добавлении второго ком-объекта и создании его экземпляра внутри приложения вылетает окошко с сообщением: "This action cannot be completed because the other program is busy. Choose 'Switch To' to activate the busy program and correct hte problem." И там две кнопки "Switch To" и "Retry" на которые что жми, что не жми, все равно не помогает. Может кто встречался с такой проблемой, подскажите. Вынос ком-объектов в dll — не желателен. Заранее спасибо.
Re: Проблема с Com в EXE
От: Tom Россия http://www.RSDN.ru
Дата: 07.12.04 16:12
Оценка:
Здравствуйте, Fors, Вы писали:

F>Народ, у меня такая проблема. Есть приложение,в котором нужно создать ком-объекты, имплементирующие определенные интерфейсы. Эти объекты должны быть внутри exe-шника. Exe — SDI приложение. Делаю Insert ATL object, добавляю в проект поддержку ATL, создаю ком-объект. Все работает. Однако при добавлении второго ком-объекта и создании его экземпляра внутри приложения вылетает окошко с сообщением: "This action cannot be completed because the other program is busy. Choose 'Switch To' to activate the busy program and correct hte problem." И там две кнопки "Switch To" и "Retry" на которые что жми, что не жми, все равно не помогает. Может кто встречался с такой проблемой, подскажите. Вынос ком-объектов в dll — не желателен. Заранее спасибо.


Это проявляется работа фильтров сообщений. Обьект твой создаётся в STA для которого зарегистрирован такой фильтр. Лечить это можно:
1 Указав, что обьект должен создаваться в MTA. См. свой скрипт регистрации обьекта. Можешь поменять там Apartment, на Free или Both. Во втором случае поток, который вызывает CoCreateInstance должен быть инициализирован при помощи CoInitializeEx с флагом COINIT_MULTITHREADED
2 Зарегистрировав свой фильтр сообщений для данного STA аппартамента (см CoRegisterMessageFilter)
Народная мудрось
всем все никому ничего(с).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.