关键字: vc 系统服务 开发 程序
//以下程序为Win32控制台项目中编写。
//一、要添加的头文件
#include "winsvc.h"
//二、全局变量、全局函数定义
//服务全局变量
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
SERVICE_FAILURE_ACTIONS sfa;
CString m_sServiceName="在此输入你的服务名称";
CString m_sServiceDisplayName="在此输入你的服务显示名称";
CString m_sServiceDescription="在此输入你的服务描述";
//服务全局函数定义
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI ServiceCtrl(DWORD Opcode);
void InstallService();
void RemoveService();
// 要编写的系统服务入口函数
UINT MyServerMain(LPVOID lpvoid);
//三、_tmain函数
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误: MFC 初始化失败/n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
SERVICE_TABLE_ENTRY ste[2];
ste[0].lpServiceName=m_sServiceName;
ste[0].lpServiceProc=ServiceMain;
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
{
if(_stricmp("install",argv[1]+1)==0)
{
InstallService();
}
else if(_stricmp("remove",argv[1]+1)==0)
{
RemoveService();
}
else if(_stricmp("debug",argv[1]+1)==0)
{
MyServerMain(NULL);
}
else
{
//如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
//StartServiceCtrlDispatcher 函数。
printf(" -install to install the service /n");
printf(" -remove to remove the service /n");
printf(" -debug to debug the service /n");
printf("/n StartServiceCtrlDispatcher being called./n");
printf("This may take several seconds.Please wait./n");
if(!StartServiceCtrlDispatcher(ste))
printf(TEXT("StartServiceCtrlDispatcher failed."));
else
printf(TEXT("StartServiceCtrlDispatcher OK."));
}
}
else
{
如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
StartServiceCtrlDispatcher 函数。
printf(" -install to install the service /n");
printf(" -remove to remove the service /n");
printf(" -debug to debug the service /n");
printf("/n StartServiceCtrlDispatcher being called./n");
printf("This may take several seconds.Please wait./n");
if(!StartServiceCtrlDispatcher(ste))
printf(TEXT("StartServiceCtrlDispatcher failed."));
else
printf(TEXT("StartServiceCtrlDispatcher OK."));
//测试
//MyServerMain(NULL);
}
}
return nRetCode;
}
//四、系统服务函数
void InstallService()
{
LPTSTR lpSysPath=new char[MAX_PATH];
GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
SERVICE_DESCRIPTION SvrDes;
SvrDes.lpDescription=m_sServiceDescription.GetBuffer();
CString RunPath;
::GetModuleFileName(::AfxGetInstanceHandle(), RunPath.GetBuffer(1024), 1024);
lpsysfilename=RunPath;
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
{
svc=CreateService(scm,m_sServiceName,m_sServiceDisplayName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
Sleep(1000);
ChangeServiceConfig2(svc,SERVICE_CONFIG_DESCRIPTION,&SvrDes);
SC_ACTION ssa[1];
ssa[0].Delay=5000; //服务失败5000毫秒后执行失败操作
ssa[0].Type=SC_ACTION_RESTART; //失败后重新启动服务
sfa.dwResetPeriod=0; //0秒后重置失败计数
sfa.lpCommand=NULL;
sfa.lpRebootMsg=NULL;
sfa.cActions=1;
sfa.lpsaActions=ssa;
ChangeServiceConfig2(svc,SERVICE_CONFIG_FAILURE_ACTIONS,&sfa);
Sleep(1000);
}
if(svc!=NULL)
{
svc=OpenService(scm,m_sServiceName,SERVICE_START);
}
if(svc!=NULL)
{
StartService(svc,0,NULL);
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
delete lpSysPath;
}
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
ss.dwServiceType=SERVICE_WIN32;
ss.dwCurrentState=SERVICE_START_PENDING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
ss.dwServiceSpecificExitCode=0;
ss.dwWin32ExitCode=0;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
ssh=RegisterServiceCtrlHandler(m_sServiceName,ServiceCtrl);
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
AfxBeginThread(MyServerMain,NULL,NULL);
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;
SetServiceStatus(ssh,&ss);
}
void WINAPI ServiceCtrl(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
ss.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(ssh,&ss);
break;
case SERVICE_CONTROL_CONTINUE:
ss.dwCurrentState=SERVICE_RUNNING;
SetServiceStatus(ssh,&ss);
break;
case SERVICE_CONTROL_PAUSE:
ss.dwCurrentState=SERVICE_PAUSED;
SetServiceStatus(ssh,&ss);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
SetServiceStatus(ssh,&ss);
}
void RemoveService()
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
SERVICE_STATUS ssStatus;
//打开服务管理数据库
schSCManager=OpenSCManager(
NULL, //本地计算机
NULL, //默认的数据库
SC_MANAGER_ALL_ACCESS //要求所有的访问权
);
if(schSCManager)
{
//获取服务程序句柄
schService=OpenService(
schSCManager, //服务管理数据库句柄
m_sServiceName, //服务名
SERVICE_ALL_ACCESS //响应所有的访问请求
);
if(schService)
{
//试图停止服务
if(ControlService(
schService, //服务程序句柄
SERVICE_CONTROL_STOP, //停止服务请求码
&ssStatus //接收最后的服务状态信息
))
{
_tprintf(TEXT("Stopping %s."),m_sServiceName);
Sleep(1000);
//等待服务停止
//
while(QueryServiceStatus(schService,&ssStatus))
{
if(SERVICE_STOP_PENDING==ssStatus.dwCurrentState)
{
_tprintf(TEXT("."));
Sleep(1000);
}
else
break;
}
if(SERVICE_STOPPED==ssStatus.dwCurrentState)
_tprintf(TEXT("/n%s stopped. /n"),m_sServiceName);
else
_tprintf(TEXT("/n%s failed to stopp. /n"),m_sServiceName);
}
//删除已安装的服务程序安装
if(DeleteService(schService))
_tprintf(TEXT("%s removed. /n"),m_sServiceName);
else
_tprintf(TEXT("DeleteService failed - %s. /n"), GetLastError());
CloseServiceHandle(schService);
}
else
_tprintf(TEXT("OpenService failed - %s /n"),GetLastError());
CloseServiceHandle(schSCManager);
}
else
_tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());
}
//五、你自己的功能函数入口
UINT MyServerMain(LPVOID lpvoid)
{
return 0;
}