Я тоже столкнулся с проблемой, связанной с 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-объекты?
В моем случае:
- Я не мог помешать
RegisterClassObjects
назвать
- Я не хотел отключать COM, вводя
_ATL_NO_COM_SUPPORT
, потому что я не до конца понимал последствия внесения такого изменения в приложение, о котором ничего не знал
- Я не хотел изменять 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]