У меня есть сервисный проект в Visual Studio 2005, который был преобразован в проект Visual Studio 2010. И я заметил проблему с функцией PreMessageLoop, которая выглядит следующим образом:
HRESULT CMyModule::PreMessageLoop (int nShowCmd)
{
HRESULT result = CAtlServiceModuleT<CMyModule,100>::PreMessageLoop(nShowCmd);
if (ERROR_SUCCESS == result)
{
ComplicatedInitialization();
_AtlModule.SetServiceStatus (SERVICE_START_PENDING);
MoreComplicatedInitialization();
_AtlModule.SetServiceStatus (SERVICE_START_PENDING);
StillMoreComplicatedInitialization();
_AtlModule.SetServiceStatus (SERVICE_START_PENDING);
EvenMoreComplicatedInitialization();
}
return result;
}
Это прекрасно работает в Visual C ++ 2005: функция Run вызывает мой PreMessageLoop, который вызывает базовый класс PreMessageLoop. Сложная инициализация происходит, когда служба находится в SERVICE_START_PENDING. Когда мой PreMessageLoop возвращается, Run вызывает SetServiceStatus (SERVICE_RUNNING).
Visual C ++ 2010 отличается: базовый класс PreMessageLoop вызывает SetServiceStatus (SERVICE_RUNNING). Сложная инициализация происходит, когда служба находится в состоянии SERVICE_RUNNING, что не очень хорошо (поскольку служба выглядит так, как будто она работает, хотя на самом деле она все еще инициализируется).
Могу ли я просто переместить вызов PreMessageLoop базового класса в конец моего вызова PreMessageLoop? Или это сложнее, чем простой ход?
Followup
Похоже, что служба может перейти из состояния SERVICE_RUNNING обратно в состояние SERVICE_START_PENDING. Это мудро?