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