Здравствуйте Долгов Сергей Сергеевич, Вы писали:
ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.
А сервер вы сами писали? Если да, то начем?
А вообще нужно код, который следит за блокировкой
сервера и убрать код, который закрывает exe при кол-ве
блокировок = 0.
Если сервер написан на ATL, то просто уберите строчку
// _Module.StartMonitor();
Здравствуйте Долгов Сергей Сергеевич, Вы писали:
ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.
Непонятно только зачем это нужно, если у нет ниодного клиента?
Система автоматически выгружает сервер, если число ссылок на него становиться равным нулю.
Искуственно можно добиться не уменьшения счетчика ссылок на него (не вызывать Release()).
Только лучше этого не делать.
Здравствуйте Долгов Сергей Сергеевич, Вы писали:
ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.
Сделать можно, и хотя это не по правилам COM, но те же MS Word и Excel их успешно нарушают.
Вариантов это сделать много, самый простой вызывать AddRef после создания основного объекта приложения ещё раз. Когда приложение нужно будет закрыть надо не забыть вызвыть Release.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте VD, Вы писали:
VD>Непонятно только зачем это нужно, если у нет ниодного клиента? VD>Система автоматически выгружает сервер, если число ссылок на него становиться равным нулю.
Здравствуйте VD, Вы писали:
VD>Здравствуйте Dima2, Вы писали:
D>>Ну почему иногда бывает очень нужно.
VD>Буду рад узнать для чего?
Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что..., или например клиент дал задание для сервера и отвалил.
Здравствуйте Dima2, Вы писали:
D>Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что...,
Для этого в ATL существует специальная поддержка, находится в основном модуле:
const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
D>или например клиент дал задание для сервера и отвалил.
А кто потом этот объект убивает?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>Здравствуйте Dima2, Вы писали:
D>>Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что...,
IT>Для этого в ATL существует специальная поддержка, находится в основном модуле:
IT>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
5000 может оказаться маловато, клиент может соединиьтся и через 7000...1000000 и
опять будет ожидать запуска сервера по полной программе.
Здравствуйте Dima2, Вы писали:
IT>>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
D>5000 может оказаться маловато, клиент может соединиьтся и через 7000...1000000 и D>опять будет ожидать запуска сервера по полной программе.
Никто не мешает поменять 5000 на наиболее подходящий вариант.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>Здравствуйте Dima2, Вы писали:
IT>>>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
D>>5000 может оказаться маловато, клиент может соединиьтся и через 7000...1000000 и D>>опять будет ожидать запуска сервера по полной программе.
IT>Никто не мешает поменять 5000 на наиболее подходящий вариант.
В принципе да, но этот вариант будет приближаться к варианту когда сервер вообще не выгружается.
Здравствуйте Dima2, Вы писали:
D>Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что..., или например клиент дал задание для сервера и отвалил.
Вообще-то в таких случаях лучше делать сервер, например, системным сервисом, чтобы он грузился до запуска клиента, а не через клиента.
Вот только дело-то в другом. Что вы понимаете под соединяться и отваливать?
Если соединяться — это, например, вызов CoCreateInstance() из клиента, то чтобы получать указатель на одну и ту же копию сервера, нужно соответствующим образом настроить Class Factory сервера, иначе каждый запрос клиента будет создавать новую копию сервера.
Здравствуйте IT, Вы писали:
IT>Для этого в ATL существует специальная поддержка, находится в основном модуле:
IT>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
Да, только это задержка не на загрузку, а на выгрузку — before shutting down.
А на загрузку вроде никаких задержек нет... да и быть не должно.
IT>А кто потом этот объект убивает?
В том-то и дело, что сервер потом никто не убъет (если он не настроен специальным образом),
т.к. будет висеть одна или более пустых ссылок (RefCount > 0).
Здравствуйте Долгов Сергей Сергеевич, Вы писали:
ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.
А по-моему в IClassFactory есть очень простой метод LockServer(), именно для этих целей.