Finch, задача, которую я решаю, создать что то вроде сигнала. Мне нужен запуск чужих служб после какого то условия.
Например задача ожидания доступности ресурса в сети: я создаю службу ожидающую русурс, а в зависимости от нее указываю эти самые чужие службы. Понимаю, что ее можно решить в лоб - жестко работать с конкретными службами.
Код довольно сложно собрать в кучу. Попробую...
Первый вызов установки статуса службы.
(основной поток службы сразу же за точкой входа)
TIME_THREAD_TAG TimeTag;
CTimeThread* worker; //класс поток-таймер
TimeTag.Interval = DC_CHECK_INTERVAL;
TimeTag.pExecProc = &WaitForDcController; //точка пульса потока-таймера
TimeTag.pUserParam = this;
worker = new CTimeThread( TimeTag);
if ( worker->Continue( 1500))
{
Status.dwWaitHint = SERVICE_CHECK_INTERVAL;
Status.dwCurrentState = SERVICE_START_PENDING;
Status.dwCheckPoint = 1; // Или все же 0?
SetServiceStatus( Handle, &Status);
}
Точка пульса потока-таймера.
(дополнительный поток службы)
BOOL THREADAPI WaitForDcController(PTIME_THREAD_TAG pTag)
{
DWORD dwRes;
PDOMAIN_CONTROLLER_INFO dcinfo;
CServiceWrapper* srv = (CServiceWrapper*) pTag->pUserParam;
//Оповещение SCM об продолжении загрузки
srv->Status.dwCheckPoint++;
srv->Status.dwWaitHint = SERVICE_CHECK_INTERVAL;
srv->Status.dwCurrentState = SERVICE_START_PENDING;
srv->SendStatus();
dwRes = DsGetDcName( NULL, CHECK_DOMAIN_NAME, NULL, NULL, DC_FLAGS, &dcinfo);
if ( dwRes == ERROR_SUCCESS || dwTestTimer >= CHECK_MAX_WAIT)
{
if ( dwRes == ERROR_SUCCESS)
{
dwTestTimer = 0;
g_EventLog.ReportInfo(0, DC_FOUND_SUCCESS, dcinfo->DomainControllerName);
NetApiBufferFree( dcinfo);
}
else
{
g_EventLog.ReportError(0, DC_FOUND_FAILED, itocstr( CHECK_MAX_WAIT / 1000));
}
srv->Status.dwCheckPoint = 0;
srv->Status.dwWaitHint = 0;
srv->Status.dwCurrentState = SERVICE_RUNNING;
srv->SendStatus();
return FALSE;
}
else
{
dwTestTimer += pTag->Interval;
return TRUE;
}
}
Реакция на код INTERROGATE.
(поток SCM)
VOID SERVICEAPI CServiceWrapper::OnInterrogate()
{
g_EventLog.ReportInfo(0, SRV_INTERROGATE_ACCEPTED);
Status.dwCheckPoint = 0;
Status.dwWaitHint = 0;
SendStatus();
}