COM объект в сервисе(службе)

Тема в разделе "WASM.WIN32", создана пользователем MirrorBlack, 6 мар 2009.

  1. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Здравствуете.
    Появилась необходимость в сервис "впихнуть" COM объект.
    Всё идёт прекрасно пока к объекту идут запросы от программ запущенных пользователем от чьего имени стартовал сервис.
    Как только происходит попытка обращения к COM от другого пользователя, SCM предпринимает попытку загрузить ещё один экземпляр объекта. С обычным EXE этот фокус прокатывает, но с сервисом...
    Возможно вся соль в CoInitializeSecurity, но я его уже с кучей флагов перепробовал - безрезультатно
    Нужно чтоб все пользователи работали с одним экземпляром COM.

    Пишу на ассемблере (masm32).
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    MirrorBlack

    Зарегистрируй объект в ROT и будет тебе счастье.
    http://msdn.microsoft.com/en-us/library/ms694349
     
  3. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Partner
    Дык RegisterActiveObject,addr iIUnknown,addr GUID_IService,ACTIVEOBJECT_STRONG,addr pdwRegister использую, а счастья нет ...
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    MirrorBlack
    Я бы добавил флаг ROTFLAGS_ALLOWANYCLIENT

    А как получаешь сам объект. Через GetActiveObject ? Какой код ошибки возвращается?
     
  5. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Partner
    К сожалению объект получаю не я а 1С.
    С флагами я эксперементировал, результат отрицательный.
    Ошибок собственно нет, т.к. 1С подаёт запрос на загрузку объекта и происходит попытка запуска ещё одного экземпляра сервиса.
    Повторюсь:
    Всё идёт прекрасно пока к объекту идут запросы от программ запущенных пользователем от чьего имени стартовал сервис.
    Как только происходит попытка обращения к COM от другого пользователя, SCM предпринимает попытку загрузить ещё один экземпляр объекта.
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    MirrorBlack
    Перепиши фабрику класса.
    Если объект не создан - как обычно вызывай CoCreateInstance, а если уже существует - вызывай GetActiveObject.
     
  7. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Partner
    Давай сначала.
    COM реализован в EXE файле (не важно сервис это или обычный запускаемый файл).
    При запросе активации объекта SCM проверяет ROT на предмет наличия оного в ней.
    При отсутствии в ROT информации об объекте (либо объект зарегистрирован для использования одним процессом) SCM проводит загрузку EXE модуля.
    А вот здесь я не понял:
    Что мне даст GetActiveObject, если в ROT другого пользователя он не зарегистрирован?
    Зачем переписывать ClassFactory если первый её вызов идёт ТОЛЬКО после создания объекта?

    Может я и ошибаюсь, но для каждого пользователя создаётся своя ROT, а может ROT одна, и тогда с правами проблема...

    Я тут в инете вот что нашёл на эту тему:
    http://www.sql.ru/forum/actualthread.aspx?tid=168190
    Во вторник попробую разобраться...