Как повторно использовать (Delphi) OLE-сервер со вторым клиентом? - PullRequest
1 голос
/ 30 января 2009

Я написал сервер автоматизации OLE (используя Delphi). Я обычно запускаю OLE-сервер вручную и использую его как обычное приложение. Время от времени я запускаю клиента, который автоматически подключаться к существующему OLE-серверу.

Когда я завершаю работу с клиентом, сервер не завершает работу (по крайней мере, когда он был запущен вручную перед клиентом), но он не принимает любое другое соединение OLE. Запуск другого клиента вызовет новый сервер вместо повторного использования первого.

Как я могу повторно использовать тот же сервер со вторым клиентом?

(Вопрос отредактирован, чтобы правильно сформулировать его. В оригинальной версии я спрашивал, как предотвратить завершение работы сервера, что не было хорошей формулировкой)

Ответы [ 6 ]

2 голосов
/ 02 февраля 2009

В мастере COM-объектов в Delphi есть настройка "Instancing". Допустимые значения: «внутренний», «множественный экземпляр», «один экземпляр».

Я хотел повторно использовать один и тот же COM-сервер с несколькими клиентами. Вот почему я выбрал «один экземпляр», и хотя у меня будет один экземпляр моего серверного приложения для всех клиентов. Но я был неправ. «Единственный экземпляр» означает, что на моем сервере будет только один экземпляр COM-соединения. Я должен был выбрать «Multiple Instance», чтобы разрешить множественное COM-соединение (но одно за другим, не одновременное) на одном сервере.

Я думаю, что слова, используемые в мастере COM-объектов в Delphi, не совсем понятны. Вместо «множественного экземпляра», «одного экземпляра» было бы лучше иметь «многоразовое использование» и «одноразовое использование», как в этой статье об OLE Server и VB .

2 голосов
/ 30 января 2009

В клиенте используйте

ConnectKind := ckRunningOrNew

и вместо запуска нового сервера следует использовать существующий сервер.

0 голосов
/ 13 декабря 2009

Вы также можете попробовать изменить имя пользователя, который запускает сервер OLE, если это Exe, а не dll, запустив dcomcnfg и выбрав Component Services / Computers / My Computer / DCOM Config и выбрав свой сервер.

Возможно, вам придется поиграть с этим, я не могу вспомнить различия между ними, но я думаю, что "Интерактивный пользователь" должен это сделать.

0 голосов
/ 12 декабря 2009

Примечание к предыдущему сообщению «В мастере COM-объектов в Delphi есть настройка« Instancing ». ' : По крайней мере, в C ++ Builder эту опцию можно просто изменить , а затем в настройках проекта, пункт «ATL». Этот элемент появляется там для EXE-ole-сервера только после того, как вы добавили в него первый объект автоматизации.

(я также попросил автора этой прекрасной страницы упомянуть об этом в пункте 18.).

0 голосов
/ 30 января 2009

Создать объект COM как Singleton. А также для поддержания работоспособности объекта даже после того, как Клиент уйдет, добавьте дополнительный счетчик ссылок. Для этого вызовите QI один раз внутри COM-объекта.

0 голосов
/ 30 января 2009

Вы должны иметь возможность увеличить счетчик ссылок сервера автоматизации при запуске сервера как обычного приложения. То, чего вы хотите добиться, состоит из двух частей: пусть сервер не завершает работу при выходе из клиента, а также позволяет серверу не завершаться при закрытии основной формы, пока клиент все еще работает.

...