Помогите в изучении СОМ
От: Pelerin  
Дата: 31.07.05 21:07
Оценка:
Каким образом в ВСВ6 заставить СОМ-сервер отправить инфу на два и более клиента? Например, по нажатию кнопки на сервере данные с Edit отправить в клиенские Memo... Заранее спасибо...

04.08.05 14:46: Перенесено модератором из 'C/C++' — Odi$$ey
Re: Помогите в изучении СОМ
От: pvgoran Россия  
Дата: 01.08.05 03:02
Оценка:
Здравствуйте, Pelerin, Вы писали:

P>Каким образом в ВСВ6 заставить СОМ-сервер отправить инфу на два и более клиента? Например, по нажатию кнопки на сервере данные с Edit отправить в клиенские Memo... Заранее спасибо...


А для одного клиента все уже реализовано и работает? (Все, что написано ниже, предполагает, что — нет, не реализовано или не работает.)

По-моему, COM не предназначен для работы в подобных сценариях — COM-серверы не взаимодействуют с пользователем напрямую (через GUI).

Здесь можно воспользоваться "низкоуровневыми" средствами межпроцессного взаимодействия (сокеты, named pipes). Или использовать-таки COM, но по-другому: есть "главный" клиент (на котором кнопка и EditBox), есть много периферийных клиентов (на которых Memo), и есть (невидимый) сервер, к которому они все подключаются и через которого идет передача сообщений от главного клиента к периферийным.

Вариант с COM, по-моему, не очень хорош, т.к.:

1. Он скрывает детали и будет непонятно, почему оно работает или, наоборот, не работает;

2. На сервере придется (насколько я понимаю) делать неочевидные манипуляции с потоками, чтобы избежать возможных блокировок и задержек;

3. Адрес сервера скорее всего придется настраивать вне приложения (если предполагается, что программы будут работать на нескольких компьютерах, а не на одном);

4. См. п. 1.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Помогите в изучении СОМ
От: SergeyL Россия  
Дата: 01.08.05 06:39
Оценка:
Здравствуйте, Pelerin, Вы писали:

P>Каким образом в ВСВ6 заставить СОМ-сервер отправить инфу на два и более клиента? Например, по нажатию кнопки на сервере данные с Edit отправить в клиенские Memo... Заранее спасибо...


Я бы наверное сделал через события. Все клиенты которые имеют доступ к серверу подключаются через ConnectionPoint реализуют обработчики (типа OnEditChanged), а сервер их в нужный момент генерирует.
Re: Помогите в изучении СОМ
От: Pelerin  
Дата: 04.08.05 10:40
Оценка:
Видно, я задал непонятный вопрос.

Впривожу текст задачи:
Создать COM объект с поддержкой событий, реализовать в нем свойства чтения и установки текстовой строки, числа в формате Int64 и даты:
TextValue
NumberValue
DateValue
Добавить событие OnChangeValue, срабатывающее при установке значений этих свойств и возвращающее это значение в формате Variant. Событие должно быть реализовано многостоковым (multi event sink).

Реализовать клиентское приложение, демонстрирующее работу Com объекта:

На форме должны быть контролы для ввода и отображения текущих значений свойств
Клиент должен быть подключен к событию OnChangeValue и обновлять значения контролов при смене значений в Com объекте

Нужно продемонстрировать работу системы в целом, запустив одновременно 2 клиентских приложения. Изменение значения свойства в одном клиенте должно приводить к изменению одноименного свойства в другом.

Основная проблема — как связать два клиента в подобную связь? Во всех примерах, которые нашел — данные кидаются в последний подключенный клиент. Как перебрать все клиенты?
Re[2]: Помогите в изучении СОМ
От: SergeyL Россия  
Дата: 04.08.05 14:35
Оценка:
Здравствуйте, Pelerin, Вы писали:

...

Я правильно понял, что Вы сделали компонент синглтоном в exe'шнике, подключили 2 клиента и до одного из них не доходят события?
И если да то еще вопрос: компонент ATL'ный ? (как реализована IConnectionPoint::Advise итп)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.