RegisterClassObjects () не находит классы для регистрации - PullRequest
1 голос
/ 16 ноября 2009

Я в процессе преобразования приложения из Visual Studio C ++ 6.0 в Visual Studio 2008 и столкнулся с проблемами с ATL.

У меня был целый ряд проблем, но это первый вызов, который отличается в возвращаемых значениях между двумя разными компиляторами.

Следующая строка при компиляции с VC ++ 6.0 возвращает S-OK. При запуске в VS 2008 он возвращает S-FALSE. Согласно документации MSDN, это означает, что не удалось найти классы для регистрации.

_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE)

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

1 голос
/ 22 апреля 2015

Я тоже столкнулся с проблемой, связанной с RegisterClassObjects неожиданным возвратом S_FALSE. В моем сценарии состояние службы не менялось с Запуск до Запуск в устаревшем проекте C ++ / ATL / COM. RegisterClassObjects возвращал S_FALSE (фактически, предупреждающее сообщение), потому что:

  • предыдущий разработчик включил COM (_ATL_NO_COM_SUPPORT имел , а не был определен)
  • COM-объекты не определены в *.EXE

CALL STACK

  • строка 8192: *ppEntry всегда была NULL
  • AtlComModuleRegisterClassObjects
  • CAltExeModule.RegisterClassObjects
  • CAtlServiceModuleT.PreMessageLoop
    • если RegisterClassObjects не вернул S_OK, то состояние службы не было обновлено до Работает

СЛЕДУЮЩИЕ ШАГИ

Доступные вам опции будут зависеть от вашей ситуации. Почему RegisterClassObjects вызывается? Почему не обнаруживаются COM-объекты?

В моем случае:

  1. Я не мог помешать RegisterClassObjects назвать
  2. Я не хотел отключать COM, вводя _ATL_NO_COM_SUPPORT, потому что я не до конца понимал последствия внесения такого изменения в приложение, о котором ничего не знал
  3. Я не хотел изменять SDK, заменив if (FAILED(hr)) на if (SUCCEEDED(hr))

Поэтому я гарантировал, что AtlComModuleRegisterClassObjects смог найти действительный COM-объект на автоматической карте (на которую ссылается pComModule->m_ppAutoObjMapFirst)

КОНТЕКСТ

  • Visual Studio 2013
  • Windows SDK 7.1A
  • Активная библиотека шаблонов, версия 12.00

СПИСОК ЛИТЕРАТУРЫ

Учитывая, что я мало знаю о COM & ATL, я обнаружил, что это утверждение действительно откровение:

Сервисы ATL предназначены для обслуживания COM-объектов. Вы не смогли предоставить любые объекты в карте объектов. Технически ATL работает еще лучше - он обнаруживает, что нет объектов для обслуживания, поэтому нет никакого смысла запускать службу вообще ... Ошибка ваша - использование ATL в неподдерживаемый способ. Тем не менее, это очень просто удалить вызов функции регистрации объектов ...

[ИСТОЧНИК: ATL Services and 2003]

...