Я пытаюсь заставить существующий собственный C++ ATL -процесс COM-сервер в отдельный процесс. Надеюсь, DCOM может сделать это для меня, не меняя COM-сервер.Как я могу настроить DCOM для загрузки моей DLL в отдельный процесс?
Я начал с обычной настройки реестра - у меня есть запись HKCR \ CLSID {classId} и ключ InProcServer32, указывающий путь к DLL-файлу.
Я сгенерировал идентификатор приложения (GUID) и добавил его здесь и там. В частности, я добавил строковое значение «AppId» в HKCR \ CLSID {classId}, равное идентификатору приложения. Я также добавил ключ HKCR \ AppId {applicationId} и строковое значение «DllSurrogate», равное пустой строке. Я думал, что этого будет достаточно для того, чтобы заставить мой COM-сервер в стандартном системном суррогате.
Приложение DCOM появляется на консоли конфигурации DCOM. Однако, когда я вызываю CoCreateInstance()
или CoGetClassObject()
и предоставляет идентификатор класса и CLSCTX_LOCAL_SERVER
, он возвращает «Класс не зарегистрирован». Что я делаю не так?
UPD: Решено. Сделанных шагов было достаточно, чтобы заставить его работать, за исключением того, что я редактировал реестр для неправильного идентификатора класса, который по какой-то причине имел тот же путь под ключом InProcServer32 - возможно, это был адский вопрос COM.
Вы можете запустить монитор процесса и выполнить запрос реестра в CoCreateInstance. Возможно, это проблема с x64-x86, если вы работаете на ОС x64. –