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