2015-06-02 10 views
2

Я разрабатываю приложение DCOM, которое должно работать как служба. Мне удалось заставить это приложение работать как отдельное приложение (клиент запрашивает компонент, а ОС запускает автономное приложение) - для этого я выполняю MyApp.exe/regserver Но после запуска MyApp .exe/service клиент не может связаться с приложением - ни когда служба не запущена, ни когда она запущена. Клиент не разработан мной (на самом деле, это функция Excel RTD), поэтому я не могу проверить, на каком этапе происходит эта проблема. Итак, как мне зарегистрировать класс/приложение, чтобы он работал как служба? Разработанный в VS2013, создан проект ATL «service exe».Регистрация COM-класса для запуска как службы

ответ

2

Регистрация COM для обслуживания ATL-проекта очень похожа на его режим приложения: те же ключи реестра для классов COM, с той лишь разницей, что сервер размещен службой. Однако для вас важнее то, что клиенты получают доступ к COM-объектам службы через границу сеанса и с разными учетными данными. YourApp.exe работает как служба, зарегистрированная как локальная система (если вы не изменили ее вручную или не изменили код регистрации COM), тогда как клиенты вошли в систему как пользователи.

Предоставляя услугу, обязательно просмотрите Launch and Activation Permissions для ваших COM-объектов. Для устранения неполадок вы также можете изменить учетную запись пользователя для своей службы в соответствии с пользователем, запускающим клиентское приложение (чтобы исключить проблемы, связанные с разрешениями и разными учетными записями пользователей).

+1

Регистрация не * точно * то же самое. При размещении в качестве службы для регистрации класса COM требуется ['AppID'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682359.aspx) с помощью [' LocalService'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms693774.aspx), чтобы указать имя службы, поэтому COM может запустить службу, которая еще не запущена. –

+0

@RemyLebeau: да, это включено в «очень похоже». Эти же ключи, незначительные связанные с обслуживанием различия. Дело в том, что «/ service» полностью охватывает это (в частности: не нужно делать «LocalService» из кода - ATL делает это из коробки), а типичные проблемы связаны с разрешениями, а не с самой регистрацией. –

+0

Это было мое впечатление. Что я сделал: - создал HKCR/CLSID/{ProgID класса} с ключом CLSID с правильным CLSID - создал HKCR/CLSID/{CLSID класса} со значением AppID приложения - создан HKCR/AppID/{AppID из приложения} со значением LocalService = имя службы - Использование dcomcnfg разрешено всем «Каждому» У меня есть отладочный вывод при запуске сервера и запуске класса. Но журнал пуст. Хорошо, что у HKCR/CLSID/{CLSID} есть ключ «LocalServer32», но нет попытки запустить его как serer, поэтому я считаю, что он находит LocalService в HKCR/AppID/{AppID моего приложения}, но для по какой-то причине не удается запустить. – thedimitrius

 Смежные вопросы

  • Нет связанных вопросов^_^