Здравствуете. Появилась необходимость в сервис "впихнуть" COM объект. Всё идёт прекрасно пока к объекту идут запросы от программ запущенных пользователем от чьего имени стартовал сервис. Как только происходит попытка обращения к COM от другого пользователя, SCM предпринимает попытку загрузить ещё один экземпляр объекта. С обычным EXE этот фокус прокатывает, но с сервисом... Возможно вся соль в CoInitializeSecurity, но я его уже с кучей флагов перепробовал - безрезультатно Нужно чтоб все пользователи работали с одним экземпляром COM. Пишу на ассемблере (masm32).
MirrorBlack Зарегистрируй объект в ROT и будет тебе счастье. http://msdn.microsoft.com/en-us/library/ms694349
Partner Дык RegisterActiveObject,addr iIUnknown,addr GUID_IService,ACTIVEOBJECT_STRONG,addr pdwRegister использую, а счастья нет ...
MirrorBlack Я бы добавил флаг ROTFLAGS_ALLOWANYCLIENT А как получаешь сам объект. Через GetActiveObject ? Какой код ошибки возвращается?
Partner К сожалению объект получаю не я а 1С. С флагами я эксперементировал, результат отрицательный. Ошибок собственно нет, т.к. 1С подаёт запрос на загрузку объекта и происходит попытка запуска ещё одного экземпляра сервиса. Повторюсь: Всё идёт прекрасно пока к объекту идут запросы от программ запущенных пользователем от чьего имени стартовал сервис. Как только происходит попытка обращения к COM от другого пользователя, SCM предпринимает попытку загрузить ещё один экземпляр объекта.
MirrorBlack Перепиши фабрику класса. Если объект не создан - как обычно вызывай CoCreateInstance, а если уже существует - вызывай GetActiveObject.
Partner Давай сначала. COM реализован в EXE файле (не важно сервис это или обычный запускаемый файл). При запросе активации объекта SCM проверяет ROT на предмет наличия оного в ней. При отсутствии в ROT информации об объекте (либо объект зарегистрирован для использования одним процессом) SCM проводит загрузку EXE модуля. А вот здесь я не понял: Что мне даст GetActiveObject, если в ROT другого пользователя он не зарегистрирован? Зачем переписывать ClassFactory если первый её вызов идёт ТОЛЬКО после создания объекта? Может я и ошибаюсь, но для каждого пользователя создаётся своя ROT, а может ROT одна, и тогда с правами проблема... Я тут в инете вот что нашёл на эту тему: http://www.sql.ru/forum/actualthread.aspx?tid=168190 Во вторник попробую разобраться...