Совместно ли COM-активация LocalServer32 EXE из той же учетной записи разделяет процесс или нет - PullRequest
5 голосов
/ 24 февраля 2011

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

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

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

Мой раздел реестра 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, но клиенты, которые его используют do , работают как службы Windows.)

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

Ответы [ 2 ]

7 голосов
/ 24 февраля 2011

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

  • флаги активации, указанные COM-сервером при вызове CoRegisterClassObject для регистрации в SCM, могут привести к тому, что будущие запросы на активацию приведут к запуску нового экземпляра exe-процесса, самый простой и распространенный случай - использование флага REGCLS_SINGLEUSE, который разрешает использовать зарегистрированный объект класса только для одной активации.
  • В зависимости от того, как зарегистрирован класс, запросы на активацию из разных контекстов безопасности могут обслуживаться разными экземплярами exe COM-сервера (похоже, это не будет применяться в вашем сценарии, поскольку ваши клиентские приложения работают в тех же контекстах безопасности).
1 голос
/ 05 декабря 2014

Служба поддержки Microsoft опубликовала подробную статью по этому вопросу: https://support.microsoft.com/en-us/kb/169321. В этой статье рассматриваются большинство ваших вопросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...