2009-11-10 6 views
3

Я пытаюсь заставить существующий собственный 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.

+0

Вы можете запустить монитор процесса и выполнить запрос реестра в CoCreateInstance. Возможно, это проблема с x64-x86, если вы работаете на ОС x64. –

ответ

2

Follow the check list:

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

Emmm ... Какой прокси-сервер/DLL-заглушка подразумевается в точке, кроме моей DLL-сервера COM? – sharptooth

+0

Я знаю, странно, я также искал свой реестр и не мог найти DllSurrogate, что * HAVE * запись прокси/заглушки. –

+0

Может быть, они означают, что код прокси/заглушки должен быть связан с DLL-сервером COM? – sharptooth

2

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

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

+0

Здесь: http://msdn.microsoft.com/en-us/library/ms686606(VS.85).aspx они настаивают на том, что это должен быть InProcServer32, а не LocalServer32 для принудительного перевода в суррогат. В конце концов, если у меня есть мой .exe, почему я должен попросить суррогата? – sharptooth

+0

eh, thats wierd. В статье говорится, что вам нужно указать CLSCTX_LOCAL_SERVER, но явно не должен иметь раздел реестра LocalServer32 ... Я не понимаю :( –

+0

Это вполне разумно. Они объясняют это - если LocalServer32 указан, используется .exe под этим ключом, а не суррогатный. – sharptooth

0

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

+0

Да, я ожидаю, что DCOM будет использовать его в качестве суррогата. Но, видимо, этого не хочет. – sharptooth