急!如何在win2000中创建一个服务程序,定时执行另一个exe程序?
Shiyl 2005-08-16 04:12:24 如题,我想创建一个服务程序,就是那种在控制面板-〉服务中可以看到的,每天到一定时间就执行另外一个exe程序。
网上我搜索了一下,发现大致是用两种方式,一种是ATL向导自动生成服务框架,另外一种就是用StartServiceCtrlDispatcher向SCM注册服务,当中调用ServiceMain函数完成相应的处理,那么我想选择第2种方式。
部分代码如下:
VOID main(VOID)
{
SERVICE_TABLE_ENTRY serviceTable[] ={{ SERVICE_NAME,(LPSERVICE_MAIN_FUNCTION) ServiceMain},
{ NULL, NULL }
};
BOOL success;
// 向SCM注册。
success =StartServiceCtrlDispatcher(serviceTable);
if (!success)
{
ErrorHandler("In StartServiceCtrlDispatcher",GetLastError());
}
}
// 开始服务程序时SCM会调用下面的serviceMain函数。
// ServiceMain一返回。服务程序就结束了。
VOID ServiceMain(DWORD argc, LPTSTR *argv)
{
BOOL success;
// 立即调用Registration函数
serviceStatusHandle =RegisterServiceCtrlHandler(SERVICE_NAME,(LPHANDLER_FUNCTION) ServiceCtrlHandler);
if (!serviceStatusHandle)
{
terminate(GetLastError());
return;
}
success = SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR, 0, 1, 5000);
if (!success)
{
terminate(GetLastError());
return;
}
// 制造终止事件。
terminateEvent = CreateEvent (0, TRUE, FALSE,0);
if (!terminateEvent)
{
terminate(GetLastError());
return;
}
success = SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR, 0, 2, 1000);
if (!success)
{
terminate(GetLastError());
return;
}
if (argc == 2)
{
int temp = atoi(argv[1]);
if (temp < 1000)
beepDelay = 2000;
else
beepDelay = temp;
}
success = SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR, 0, 3, 5000);
if (!success)
{
terminate(GetLastError());
return;
}
// 开始服务程序。
success = InitService();
if (!success)
{
terminate(GetLastError());
return;
}
success = SendStatusToSCM(SERVICE_RUNNING,NO_ERROR, 0, 0, 0);
if (!success)
{
terminate(GetLastError());
return;
}
// 等待终止信号。
WaitForSingleObject (terminateEvent, INFINITE);
terminate(0);
}
// 开始线程同时初试化服务程序
BOOL InitService()
{
DWORD id;
//开始服务程序的线程
threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE) ServiceThread,0, 0, &id);
if (threadHandle==0)
return FALSE;
else
{
runningService = TRUE;
return TRUE;
}
}
我看了说明知道在ServiceMain函数中会调用InitService函数,这将启动线程并做服务的真正工作。如果该调用成功,SverviceMain将会通知SCM服务已经成功启动。
现在比较迷茫的是,这些都是按照服务程序规则写的代码,那么我自己需要定时调用另外一个exe的代码应该放在哪里?还有这段代码编译之后生成的是不是仅仅只是服务程序,安装、卸载服务程序的程序是不是需要另外再写?
谢谢!