急!如何在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的代码应该放在哪里?还有这段代码编译之后生成的是不是仅仅只是服务程序,安装、卸载服务程序的程序是不是需要另外再写?

谢谢!

...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ximenying 2005-08-19
  • 打赏
  • 举报
回复
一一般来说,写服务我都用ATL自动生成服务框架,然后在框架里添加自己需要的功能。
leposy 2005-08-19
  • 打赏
  • 举报
回复
SetTimer当然可以的,在ServiceMain里面调用就可以了,用::DeleteService(hService);卸载服务
Shiyl 2005-08-19
  • 打赏
  • 举报
回复
谢谢各位,但是现在又一个问题,就是在服务中怎么定时知道当前时间啊?我用settimer好像不行啊
wshcdr 2005-08-16
  • 打赏
  • 举报
回复
谢谢啦各位,最后再问一下,用vc创建工程的时候是选择什么类型?就是控制台程序那种?
///////////////////////////
选择控制台就可
Shiyl 2005-08-16
  • 打赏
  • 举报
回复
谢谢啦各位,最后再问一下,用vc创建工程的时候是选择什么类型?就是控制台程序那种?
wshcdr 2005-08-16
  • 打赏
  • 举报
回复
现在比较迷茫的是,这些都是按照服务程序规则写的代码,那么我自己需要定时调用另外一个exe的代码应该放在哪里?
/////////////////////////////
threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE) ServiceThread,0, 0, &id);
应该在ServiceThread实现调用的代码


还有这段代码编译之后生成的是不是仅仅只是服务程序,安装、卸载服务程序的程序是不是需要另外再写?
////////////////////////////
安装,卸载服务的程序是需要另写的
吹泡泡的小猫 2005-08-16
  • 打赏
  • 举报
回复
服务的安装和卸载其实就是在注册表中写一些东西,同时可能需要操作一些API,可能用到:
StartService
OpenService
CreateService

你的服务已经成功启动并创建了一个线程,定时启动其他exe的事情可以放在这个线程中做
Shiyl 2005-08-16
  • 打赏
  • 举报
回复
谢谢楼上的兄弟:)
我知道要写个循环,具体处理的方法我也知道,现在的问题是我不清楚这段处理代码应该放在哪里,请指教。谢谢!
windcsn 2005-08-16
  • 打赏
  • 举报
回复
你可以写一个循环吧,在循环中等待时间到来
安装和卸载需要写另外一个程序

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧