Используется ли 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, работающими под учетными записями пользователей.

5
задан M.M 4 December 2014 в 23:24
поделиться