Конференция "Corba" » Shared COM Object [Delphi, Windows]
 
  • Deltas © (05.02.09 13:26) [0]
    Есть out-of-process сервер COM (Instancing type Single Instance). При запуске нескольких клиентов COM и обращении к интерфейсу объекта COM зарегистрированного в системе, запускается копия сервера для каждого клиента (соответственно, для каждого клиента создается свой экземпляр класса на сервере). Как сделать так, чтобы клиенты COM обращались к одному и тому же объекту COM на сервере (запускалась только одна копия сервера с одним созданным внутри экземпляром класса)?
  • clickmaker © (05.02.09 15:01) [1]
    ciMultiInstance, видимо
    с потоковой моделью Apartment
  • clickmaker © (05.02.09 15:05) [2]
    или tmSingle, если надо, чтобы клиенты могли обращаться только по очереди
  • Deltas © (05.02.09 18:39) [3]

    > ciMultiInstance, видимо
    > с потоковой моделью Apartment

    В случае Instancing type Multiple Instance несколько копий сервера не запускается, но на сервере создается экземпляр класса COM объекта для каждого клиента. Поэтому два разных клиента все равно работают с разными COM объектами.
  • clickmaker © (06.02.09 11:35) [4]
    > [3] Deltas ©   (05.02.09 18:39)

    тогда используй потоковую модель Single
    запросы от клиентов будут ставиться в очередь к одному объекту
    или tmFree, но тогда придется самому следить за синхронизацией доступа разных потоков к данным объекта
  • Deltas © (06.02.09 18:00) [5]
    Получается то же самое. Несколько объектов COM (экземпляров класса COM), которые создаются на сервере для каждого клиента. Вопрос сводится к следующему: как получить ссылку на интерфейс IUnknown уже существующего на сервере объекта COM, не создавая новый объект?

    Конечно, на сервере можно создать глобальные переменные, которые будут использоваться всеми объектами COM, но хотелось бы, чтобы клиенты обращались к единственному объекту COM на сервере и использовали совместно данные, которые хранятся в полях класса, реализующего интерфейсы объекта COM.
  • clickmaker © (09.02.09 16:29) [6]
    ну так сделай его ciSingleInstance
    с моделью tmFree или tmSingle

    в любом случае, если сделать экзешник сервисом, то запускать можно один его экземпляр
  • Григорьев Антон © (10.02.09 13:08) [7]
    Тут две задачи:

    1. Сделать так, чтобы все удалённые клиенты работали с одной копией сервера. По умолчанию сервер запускается в контексте того пользователя, в котором работает клиент, и если клиенты выполняются под разными пользователями, для каждого будет свой экземпляр. Изменить эти настройки можно с помощью утилиты dcomcnfg. Найдите там в списке свой сервер и в его настройках на закладке "Удостоверение" поменяйте опцию "Запускающий пользователь" на "Текущий пользователь" или "Указанный пользователь".

    2. Сделать так, чтобы разные клиенты работали с одним COM-объектом. Для этого кокласс должен быть реализован как синглетон. Delphi не поддерживает создание синглетонов, но это можно преодолеть, чуть-чуть поработав напильником :) Пример такой работы есть здесь: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1317
  • Deltas © (12.02.09 16:04) [8]

    > Григорьев Антон ©   (10.02.09 13:08) [7]

    Спасибо! Наконец-то получил ответ на свой вопрос.
 
Конференция "Corba" » Shared COM Object [Delphi, Windows]
Есть новые Нет новых   [119285   +20][b:0][p:0]