Регистрация COM-класса для работы в качестве службы

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


person thedimitrius    schedule 02.06.2015    source источник


Ответы (1)


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

Сделав это службой, обязательно ознакомьтесь с разрешениями на запуск и активацию для своего COM-объекты. Для устранения неполадок вы также можете изменить учетную запись пользователя для своей службы, чтобы она соответствовала пользователю, запускающему клиентское приложение (чтобы исключить проблемы, связанные с разрешениями и различными учетными записями пользователей).

person Roman R.    schedule 02.06.2015
comment
Регистрация - это не в точности то же самое. При размещении в качестве службы для регистрации класса COM требуется AppID < / a> со значением LocalService, чтобы указать имя службы, поэтому COM может запустить службу, которая еще не запущена. - person Remy Lebeau; 02.06.2015
comment
@RemyLebeau: да, это очень похоже на. Те же ключи, небольшие отличия, связанные с сервисом. Дело в том, что / service покрывает это полностью (в частности: не нужно делать LocalService из кода - ATL делает это из коробки), и типичные проблемы связаны с разрешениями, а не с самой регистрацией. - person Roman R.; 02.06.2015
comment
У меня тоже было такое впечатление. Я сделал следующее: - создал HKCR / CLSID / {ProgID of class} с ключом CLSID с правильным CLSID - создал HKCR / CLSID / {CLSID класса} со значением AppID приложения - создал HKCR / AppID / {AppID of app} со значением LocalService = service name - с помощью dcomcnfg разрешено все для всех, у меня есть отладочные данные при запуске сервера и при запуске класса. Но журнал пуст. Хорошо то, что у HKCR / CLSID / {CLSID} есть ключ LocalServer32, но нет попытки запустить его как serer, поэтому я думаю, что он находит LocalService в HKCR / AppID / {AppID моего приложения}, но по какой-то причине не работает бежать. - person thedimitrius; 02.06.2015
comment
N.B .: Если я запускаю службу вручную из управления компьютером - она ​​работает нормально, но даже в этом случае COM-клиент (в частности, Excel RTD) не может получить доступ к моему приложению. - person thedimitrius; 02.06.2015
comment
Наличие клиента, который вы не можете отлаживать, является проблемой, но для начала вы можете создать простое приложение командной строки с CoInitialize + CoCreateInstance и посмотреть, сможет ли он создать ваш COM-объект, размещенный на сервере. - person Roman R.; 02.06.2015