Как именно я могу настроить DCOM для загрузки моей DLL в отдельный процесс? - PullRequest
3 голосов
/ 10 ноября 2009

Я пытаюсь заставить существующий встроенный COM-сервер C ++ ATL in-proc в отдельный процесс. Я надеюсь, что DCOM сможет сделать это для меня, не меняя COM-сервер.

Я начал с обычной настройки реестра - у меня есть запись 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.

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

Следуйте контрольному списку :

  1. В реестре должно быть указано значение AppID, указанное в разделе CLSID, и соответствующий ключ AppID. ( проверено )
  2. В вызове активации установлен бит CLSCTX_LOCAL_SERVER, а ключ CLSID не указывает LocalServer32, LocalServer или LocalService. ( проверено )
  3. Ключ CLSID содержит подраздел InprocServer32. ( проверено )
  4. Прокси-библиотека-заглушка, указанная в ключе InprocServer32, существует. ???
  5. Значение DllSurrogate существует под ключом AppID. ( проверено )
2 голосов
/ 10 ноября 2009

неправильный ключ реестра. вам нужно установить LocalServer32, а не InProcServer32 в HKCR \ CLSID {classId}.

Однако Windows не может создать экземпляр DLL. Так что вам нужно изменить вашу программу в полноценный COM-сервер. Windows запустит ваш EXE и отправит аргумент / встраивание. Затем вы можете создать CComModule и запустить вашу программу.

0 голосов
/ 10 ноября 2009

Разве не для этого был создан DLLHOST.EXE?

...