У меня есть ATL exe-сервер, написанный на C ++ (Visual Studio 2010, с объединением dll прокси-стержня). Исполняемый файл скомпилирован для Windows 7 x86 и x64. Следующее происходит на обеих архитектурах:
Exe-сервер ATL должен функционировать как «серверный процесс», то есть - для каждой машины должен существовать один процесс (MyATLServer.exe, ТОЛЬКО один!), И многие клиенты (давайте будем простыми: на одной машине) потребляют COM объекты из него. Сервер сохраняет состояние приложения (в памяти), и все клиенты должны «делиться» этим состоянием, используя открытые COM-объекты сервера.
Сервер exe обычно запускается при запуске системы, потому что он вызывается COM-вызовом для создания одного из размещенных на нем объектов. Вызов происходит изнутри процесса spoolsv.exe (служба диспетчера очереди печати). Это приводит к тому, что серверный процесс запускается от имени пользователя «SYSTEM» (я полагаю, из-за того, что spoolsv.exe работает с «SYSTEM»).
Когда один из клиентов создает COM-объект с сервера ATL, создается другой процесс (снова MyATLServer.exe) (выполняется под пользователем, вошедшим в Windows), поэтому он не может совместно использовать состояние приложения с «исходным» «один (который работает под« СИСТЕМА »). Второй клиент подключится к тому, который был создан зарегистрированным пользователем («второй»).
После поиска бесчисленных форумов в сети мне удалось сделать следующие выводы:
1) Мой сервер ATL использует модуль ATL по умолчанию (автоматически сгенерированный VS2010), который наследуется от ATL :: CAtlExeModuleT <>. Копаясь в заголовках ATL, я уверен, что этот модуль вызывает AtlComModuleRegisterClassObjects с правильными флагами для этого вида использования (dwClsContext = CLSCTX_LOCAL_SERVER, flags = REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED). Так что это исключает.
2) Используя start -> run -> dcomcnfg -> DCOM Config -> MyATLServer -> Properties, я установил параметр «Этот пользователь» на вкладке «Удостоверение» (с пользователем локального администратора). На вкладке «Местоположение» параметр «Запустить приложение на этом компьютере» не выбран и выделен серым цветом. Это заставило меня искать снова, и я попал сюда: http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/4f63ee11-e472-40f9-85db-a6b235d7579c.
Ссылка объясняет, что x64-версия утилиты dcomcnfg глючит, и ее следует использовать в 32-битной версии под x64 Windows (start-> run -> 'mmc comexp.msc / 32'). После проверки на двух системах (по одной на каждой) я обнаружил, что параметр «Запустить приложение на этом компьютере» выделен серым цветом и не выбран на обоих.
С этого момента я полностью потерян (и пытаюсь подавить разочарование ... :-)).
Я на правильном пути? Кто-нибудь делал это раньше?
Или первоначальное намерение - как сделать мой ATL exe-сервер «отдельно обработанным»?
Спасибо!
Омри