Активация COM LocalServer32 EXE из той же учетной записи пользователя совместно использует существующий процесс или нет?

У меня COM-сервер LocalServer32 EXE запускается, когда клиентское приложение вызывает c_com_ptr :: CreateInstance (используя оболочки ATL.)

В Windows 7, когда второе клиентское приложение, работающее под той же учетной записью пользователя, также вызывает c_com_ptr :: CreateInstance, запускается вторая копия EXE под той же учетной записью пользователя. Из прошлой жизни у меня создалось впечатление, что второй клиент будет использовать первый EXE.

Является ли процесс LocalServer32 общим или нет? Когда, а когда нет? Поиск ответа в Google дает мне огромное отношение шума к сигналу, и я не могу найти ответ.

В моем разделе реестра CLSID есть значение LocalServer32, указывающее путь EXE, ProgID, Programmable (пустая строка), TypeLib (GUID) и VersionIndependentProgId. У меня есть ключ AppID.

Я не хочу запускать EXE как службу, и я не возражаю, что процесс не является общим. Я просто хочу знать правила, чтобы знать, чего ожидать (начиная с Windows Server 2003).

РЕДАКТИРОВАТЬ: Следуя приведенному ниже ответу Криса, я проверил вызов CoRegisterClassObject на моем сервере. Я использую ATL, и я переопределил MyServer :: RegisterClassObjects, чтобы подключиться к цепочке вызовов CAtlExeModuleT :: RegisterClassObjects и увидеть, что ATL использует CLSCTX_LOCAL_SERVER и REGCLS_MULTIPLEUSE.

Изменение этого параметра на CLSCTX_LOCAL_SERVER и REGCLS_SINGLEUSE приводит к запуску большего количества процессов, в зависимости от количества COM-объектов, созданных клиентом, как и ожидалось.

Тем не менее, возвращаясь к REGCLS_MULTIPLEUSE, я получаю один процесс COM-сервера на каждый клиентский процесс COM, причем каждый серверный процесс содержит все COM-объекты своего клиента, как и ожидалось, за исключением того, что если два COM-клиента работают под одной и той же учетной записью пользователя, каждый из них получить свой собственный сервер, что не так, как я понял REGCLS_MULTIPLEUSE.

Может ли разница быть в том, что сами клиенты на самом деле являются службами Windows? (Это так.) Когда процесс службы Windows, запущенный под учетной записью пользователя, создает COM-объект в REGCLS_MULTIPLEUSE, обрабатывается ли это иначе, вызывая наблюдаемое поведение? Почему у меня более одного процесса? (И чтобы прояснить, я не хочу, чтобы мой COM-сервер работал как служба Windows, но клиенты, которые его используют, действительно работают как службы Windows.)

Кроме того, при запуске клиентов в качестве локальной системы или сетевой службы REGCLS_MULTIPLEUSE работает так, как я ожидал: запускается только один EXE-процесс COM-сервера. Несколько процессов запускаются, когда клиенты COM являются службами Windows, работающими под учетными записями пользователей.


person Jim Flood    schedule 24.02.2011    source источник


Ответы (1)


Маршрутизация запросов внепроцессной активации контролируется регистрацией объектов класса в диспетчере управления службами COM. Если SCM имеет пригодный для использования зарегистрированный объект класса, он будет использоваться для обслуживания запроса. Если этого не произойдет, он запустит экземпляр процесса exe на COM-сервере, чтобы получить его. Таким образом, маршрутизация нескольких запросов на активацию на один исполняемый процесс COM-сервера зависит, по крайней мере, от следующих факторов (я не уверен, что это полный список):

  • флаги активации, указанные COM-сервером при вызове CoRegisterClassObject для регистрации в SCM, могут привести к тому, что будущие запросы активации приведут к запуску нового экземпляра процесса exe, простейшим и наиболее распространенным случаем является использование флага REGCLS_SINGLEUSE, который позволяет зарегистрированным объект класса, который будет использоваться только для однократной активации.
  • В зависимости от того, как зарегистрирован класс, запросы активации из разных контекстов безопасности могут обслуживаться разными экземплярами COM-сервера exe (похоже, это не применимо в вашем сценарии, поскольку ваши клиентские приложения работают в тех же контекстах безопасности).
person Chris Dickson    schedule 24.02.2011
comment
Ваш ответ побудил меня исследовать параметры CoRegisterClassObject, но я до сих пор не понимаю наблюдаемого поведения - я использую REGCLS_MULTIPLEUSE. Смотрите мои правки в моем вопросе выше. - person Jim Flood; 01.03.2011
comment
@Jim: Сейчас я нахожусь на пределе своих знаний, но у меня есть подозрение, что таблицы объектов класса, поддерживаемые COM SCM, ограничены сеансом входа в систему и что SCM будет повторно использовать объект класса только в том же сеансе. Если все ваши клиенты представляют собой службы, запущенные в отдельных сеансах, они получают свой собственный экземпляр объекта класса (и, следовательно, свой собственный серверный процесс) даже с REGCLS_MULTIPLEUSE и даже если они работают с одним и тем же идентификатором учетной записи. Гипотеза, которую вы все равно можете проверить. - person Chris Dickson; 02.03.2011
comment
В этом есть смысл. Я сам посмотрю немного дальше, но я буду рад отметить это как ответ. Спасибо. - person Jim Flood; 08.03.2011