SetServiceStatus(ssh,&ss); //put your coed here ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS; ss.dwCurrentState=SERVICE_RUNNING; ss.dwControlsAccepted=SERVICE_ACCEPT_STOP; ss.dwWin32ExitCode=NO_ERROR; ss.dwCheckPoint=0; ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss); //put your coed here }void WINAPI Handler(DWORD Opcode) { switch(Opcode) { case SERVICE_CONTROL_STOP: //put your code here ss.dwCurrentState=SERVICE_STOPPED; ss.dwWin32ExitCode=0; ss.dwCheckPoint=0; ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss); break; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus(ssh,&ss); break; } } 以上是一个完整的服务程序。
你也可以用ATL写
这是一个服务程序的例子。#include "windows.h"
#include "winsvc.h"void WINAPI ServiceMain(DWORD dwArgc,LPTSTR * lpszArgv);
void WINAPI Handler(DWORD Opcode);SERVICE_STATUS_HANDLE ssh;
SERVICE_STATUS ss;int main(int argc,char * argv[])
{
SERVICE_TABLE_ENTRY ste[2];
ste[0].lpServiceName="ServiceDemo";
ste[0].lpServiceProc=ServiceMain;
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
return 0;
}void WINAPI ServiceMain(DWORD dwArgc,LPTSTR * lpszArgv)
{
ssh=RegisterServiceCtrlHandler("ServiceDemo",Handler);
ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_START_PENDING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
//put your coed here
ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
//put your coed here
}void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
//put your code here
ss.dwCurrentState=SERVICE_STOPPED;
ss.dwWin32ExitCode=0;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
break;
case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus(ssh,&ss);
break;
}
}
以上是一个完整的服务程序。
服务程序还需要一个安装程序,将它安装(即OnCreate()函数的处理),启动等操作,下面分别是,服务安装一次后就可以了,就已经添加到注册表中,在控制面板的服务中可以看到的,不需要每次都安装的:OnStart()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
{
scv=::OpenService(scm,"ServiceDemo",SERVICE_ALL_ACCESS);
if (scv!=NULL)
{
::StartService(scv,0,NULL);
::CloseServiceHandle(scv);
}
::CloseServiceHandle(scm);
}
}OnCreate()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
scv=::CreateService(scm,
"ServiceDemo",
"ServiceDemo",
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
"E:\\VC_DEMO\\ServDemo\\Debug\\ServDemo.exe",
NULL,NULL,NULL,NULL,NULL);
if (scv!=NULL)
{
::CloseServiceHandle(scv);
}
else
{
::CloseServiceHandle(scm);
}
}
}
OnDelete()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
scv=::OpenService(scm,"ServiceDemo",SERVICE_ALL_ACCESS);
if (scv!=NULL)
{
::QueryServiceStatus(scv,&ss);
if (ss.dwCurrentState==SERVICE_RUNNING)
{
::ControlService(scv,SERVICE_CONTROL_STOP,&ss);
}
::DeleteService(scv);
::CloseServiceHandle(scv);
}
::CloseServiceHandle(scm);
}
}OnStop()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
{
scv=::OpenService(scm,"ServiceDemo",SERVICE_STOP|SERVICE_QUERY_STATUS);
if (scv!=NULL)
{
::QueryServiceStatus(scv,&ss);
if (ss.dwCurrentState==SERVICE_RUNNING)
{
::ControlService(scv,SERVICE_CONTROL_STOP,&ss);
}
::CloseServiceHandle(scv);
}
::CloseServiceHandle(scm);
}
}
服务是一个可执行文件,注册在系统注册表中,WINNT启动时,如果服务设置为自动启动,则NT会自动启动该服务。2.安装程序
但是服务写好后,第一次需要安装到系统中,即添加到注册表中,这样才会在控制面板的“服务”窗口中出现,当然不用直接写注册表,因为系统已经提供了API。所以这样就还需要一个安装程序,当然只需要安装一次就行了。在不再需要的时候也可以将服务卸除,这也需要通过API实现。反正就是需要实现上面两个功能,当然,也可以做在一起,在第一次运行改程序时将自己注册。但从概念是应该有两个程序。