Возможно ли иметь COM-сервер вне процесса, где для каждого экземпляра объекта используется отдельный процесс O / S? - PullRequest
5 голосов
/ 24 мая 2010

У меня есть устаревший C ++ «механизм решения», который я уже обернул в качестве внутрипроцессного COM-объекта для использования клиентскими приложениями, которым требуется только один «механизм решения».* Однако у меня теперь есть клиентское приложение, которое требует нескольких «механизмов решения».К сожалению, базовый унаследованный код имеет достаточно глобальных данных, синглетонов и потоковых ужасов, которые дают доступные ресурсы, поэтому невозможно одновременно обрабатывать несколько экземпляров этого кода.расскажите мне о какой-то магии COM, когда с помощью нескольких настроек реестра можно создать отдельный COM-сервер, работающий вне процесса (отдельный процесс операционной системы) для каждого экземпляра запрашиваемого объекта COM.

Мне повезло?

Ответы [ 3 ]

8 голосов
/ 24 мая 2010

Да, это возможно.Ключ заключается в том, чтобы зарегистрировать ваш Coclass, вызвав CoRegisterClassObject и ИЛИ - в значение REGCLS_SINGLEUSE в параметре flags.

Если ваш проект представляет собой ATL 7.0+ проект, вы можете сделать это, переопределив CAtlExeModuleT :: PreMessageLoop () , который отвечает за регистрацию объекта класса, таким образом:

HRESULT CATLHacksModule::PreMessageLoop(int nShow)
{
    HRESULT hr = RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
    if (hr == S_OK)
    {
        if (m_bDelayShutdown && !StartMonitor())
        {
            hr = E_FAIL;
        }
    }
    else
    {
        m_bDelayShutdown = false;
    }
    return hr;
}
1 голос
/ 24 мая 2010

Для блокировки экземпляра EXE вам потребуется «главный» класс, аналогичный интерфейсу «Приложения».Найдите вызов CoRegisterClassObject () для его фабрики.И измените аргумент REGCLS на REGCLS_SINGLEUSE.

Это автоматически отменит регистрацию фабрики классов, как только к ней подключится первый клиент.Вызов CoCreateInstance () для этой фабрики снова запускает новый экземпляр сервера.Я думаю.

0 голосов
/ 24 мая 2010

Я почти уверен, что это невозможно. COM-сервер вне регистрации должен глобально зарегистрировать объекты класса, которые он предоставляет (через CoRegisterClassObject); частью этой регистрации является класс GUID. Очевидно, вы не можете зарегистрировать один и тот же GUID дважды.

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