Здравствуйте, Мизантроп, Вы писали:
М>Ну вроде в описании всё понятно, кроме нескольких вещей. Во-первых, это загадочная фраза
М>[q]
М>добавляя туда обертку Fire_OnMessage уже своего событийного интерфейса (чтобы отрабатывалось событие).
М>Что Вы имели в виду?[/q]
Я имел ввиду, что есть интерфейс событий DLL — IMyEvents, а есть интерфейс событий сервера (.exe), который называется IUpEvents. С методом OnMessage.
Этот метод оборачивается вызовом Fire_OnMessage (где интерфейс извлекается из GIT и используется его метод).
Этот вызов Fire_OnMessage я помещаю в метод OnMessage интерфейса IMyEvents. Таким образом добиваясь, чтобы из потока dll, где дергается метод OnMessage интерфейса IMyEvents, через него дергался Fire_OnMessage.
М>Далее, какие апартаментные модели поддерживает объект, реализующий IMyEvents? Кто и как создаёт этот объект, в какой апартамент входит поток, в котором создаётся этот объект?
М>И самое главное, а что не получается-то?
1) объект, реализующий IMyEvents — обычный внутренний объект сервера, который создается .exe сервером на этапе инициализации сервера и передается в DLL. Как можно настроить ему апартментовую модель?
2) Поток, в котором создается этот объект — основной поток сервера, его потоковая модель настраивается наличием такого макроса внутри объекта
DECLARE_THREADING_MODEL(otFree);
и следующей директивы
#define ATL_FREE_THREADED
В опциях проекта (CBuilder6) установлено
Instancing: multiple use
OLE initialization COINIT_XXX_Flag: MULTITHREADED
Threading Model: Free
Это, надо понимать, распространяется не на все объекты сервера...
3) Не получается следующее: Если вызов Fire_OnMessage находится в основном потоке процесса, то они корректно отрабатываются. А помещенный в объект, реализующий IMyEvent, и вызываемый там в другом потоке — не дает никакого эффекта, т.е. полностью дебаггер проходит по телу Fire_OnMessage и не дает никакого результата.
М>На всякий случай:
М>М>добавляя туда CoInitializeEx(NULL, MultiThreaded..)
М>То есть вызвавший этот метод поток подключается к MTA. MTA всегда один на процесс, все потоки данного процесса, вызвавшие так CoInitializeEx, являются членами одного апартамента. Маршалинга между членами одного апартамента не требуется, и переключение потоков внутри апартамента не производится, методs работают в том потоке, в котором были вызваны.
Т.е. теоретически вообще всё должно отрабатывать просто при простой передаче указателя на IUpEvents? А у меня не работает даже если я его передаю через GIT..
М>Ну а лучше всего, вероятно: Ты не умничай, ты код давай!
М>(© Неизвестный посетитель форума) :))
=)) Там очень много методов, возможно, влияющих, может быть лучше я вышлю Вам на почту части кода, которые этим занимаются, а после того, как удастся понять, в чем дело — тогда уже сюда ту самую проблемную часть кода можно будет выложить с объяснением "для потомков"?