Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > "Общение" с COM-сервером посредством Message


Автор: Vikong 2.10.2009, 13:16
Привет всем!

Возникла такая задачка:
Есть COM-сервер и программуля, его использующая. Она запускает некий процесс в сервере, об окончании которого сервер сигнализирует отправкой сообщения через 
Код

BroadcastSystemMessage(BSF_IGNORECURRENTTASK+BSF_SENDNOTIFYMESSAGE+BSF_NOTIMEOUTIFNOTHUNG, ...)

Все работает, но порой возникает проблема, когда вызывается метод СОМ-сервера во время он-паинт и он-дроу, что приводит к возникновению ошибки 80010005 "Внешний вызов изнутри фильтра сообщений невозможен"
Согласно MSDN, это решается не прямым вызовом методов сервера, а отправкой сообщений.
Попробовал ту же BroadcastSystemMessage, но сервер не получает сообщения.

Подскажите, посредством каких функций лучше наладить общение между программулей и СОМ-сервером?
nb
Я программист БД, поэтому мои решения, возможно, покажутся идиотскими smile

Автор: xvr 5.10.2009, 12:27
Непонятно, как связаны COM сервер и 'он-паинт и он-дроу'? Где происходят эти самые 'он-паинт и он-дроу' и кто кого вызывает? 
И нафига нужен BroadcastSystemMessage если в COM это штатно реализуется Event'ами и Callback'ами?

Автор: Vikong 19.10.2009, 12:27
Вот уж так получается, что нет возможности получить доступ к callback'ам. В FoxPro, где это все реализовано, такого понятия, как "указатель на функцию" просто не существует. Можно было бы втиснуть код на ассемблере  smile , но уж больно не хоцца.
Переформулирую вопрос:
Какая функция WinAPI обеспечивает отсылку сообщения с _гарантией_, что получатель это сообщение получит, в каком бы состоянии на данный момент ни находился (например, в "спячке"), и чтобы отправитель при этом не ждал, когда получатель обработает сообщение.

Автор: xvr 19.10.2009, 12:41
Цитата(Vikong @ 19.10.2009,  12:27)
Переформулирую вопрос:
Какая функция WinAPI обеспечивает отсылку сообщения с _гарантией_, что получатель это сообщение получит, в каком бы состоянии на данный момент ни находился (например, в "спячке"), 

В другой процесс - IMHO никакая  smile 
Цитата

и чтобы отправитель при этом не ждал, когда получатель обработает сообщение.
А это вообще противоречит п1  smile 

Автор: Vikong 19.10.2009, 15:16
Цитата(xvr @  19.10.2009,  12:41 Найти цитируемый пост)
В другой процесс - IMHO никакая

Получается, что если получатель сообщения в другом потоке занят, то сообщение, отправленное ему, потеряется, если не будет обработано в течение некоторого промежутка времени, даже если получатель "жив", так?


Автор: xvr 19.10.2009, 16:08
Цитата(Vikong @ 19.10.2009,  15:16)
Цитата(xvr @  19.10.2009,  12:41 Найти цитируемый пост)
В другой процесс - IMHO никакая

Получается, что если получатель сообщения в другом потоке занят, то сообщение, отправленное ему, потеряется, если не будет обработано в течение некоторого промежутка времени, даже если получатель "жив", так?

Вряд ли совсем 'потеряется', но когда именно оно будет обработано неизвестно. А если получатель помрет (или закроет окно/нить куда посланно сообщение), то оно вообще может не обработаться  smile 

Если нужно просто отсигнализировать о чем то, попробуйте примитивы синхронизации (Event и прочие)
См. CreateEvent в MSDN

Автор: Vikong 20.10.2009, 07:51
Цитата(xvr @  19.10.2009,  16:08 Найти цитируемый пост)
Вряд ли совсем 'потеряется', но когда именно оно будет обработано неизвестно. А если получатель помрет

Это для меня как раз не критично. Главное, чтобы сообщение было обработано рано или поздно. А если получатель "умер", то уже никакие сообщения не нужны.


Цитата(xvr @  19.10.2009,  16:08 Найти цитируемый пост)
Если нужно просто отсигнализировать о чем то, попробуйте примитивы синхронизации (Event и прочие)
См. CreateEvent в MSDN

Спасибо за ссылку, посмотрю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)