C编写Windows服务程序学习

来源:互联网 发布:天津seo公司 编辑:程序博客网 时间:2024/04/29 19:32

本文主要讲述Windows服务程序的编写,分享完整代码,初学者可以直接编译通过,并查看结果,基本知识及步骤读者可以参考网络中其他文章。下面是Windows服务程序的全部代码,最后是安装服务。

#include <windows.h>
#include <stdio.h>

#define SLEEP_TIME 5000
#define LOGFILE "E:\\myservice.txt"
#define SERVICE_NAME "MYSERVICE"

SERVICE_STATUS ServiceStatus; //服务状态
SERVICE_STATUS_HANDLE hStatus; //服务状态句柄

void WINAPI ServiceMain(int argc, char **argv); //服务主程序
void WINAPI ControlHandler(DWORD request); //服务控制程序

boolean running = TRUE;

int WriteToLog(char *str)
{
 FILE *log;
 fopen_s(&log,LOGFILE, "a+");
 if (log == NULL)
 {
  return -1;
 }
 fprintf_s(log, "%s\n", str);
 fclose(log);
 return 0;
}


void WINAPI ServiceMain(int argc, char **argv)
{
 WriteToLog("Monitoring started.");

 ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
 //在本例中只接受系统关机和停止服务两种控制命令
 ServiceStatus.dwWin32ExitCode = 0;
 ServiceStatus.dwWaitHint = 0;
 ServiceStatus.dwCheckPoint = 0;
 ServiceStatus.dwServiceSpecificExitCode = 0;

 //注册服务控制处理函数
 hStatus = RegisterServiceCtrlHandler(SERVICE_NAME, ControlHandler);

 //如果注册失败
 if (!hStatus)
 {
  WriteToLog("RegisterServiceCtrlHandler failed");
  return;
 }

 WriteToLog("RegisterServiceCtrlHandler success");

 //向SCM 报告运行状态
 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
 SetServiceStatus(hStatus, &ServiceStatus);

 //下面就开始任务循环了,你可以添加你自己希望服务做的工作
 char str[80] = { 0 }; 
 while (running)
 {
  strcpy_s(str,80,"this is a test");
  Sleep(1000);
  WriteToLog(str);
 }

 WriteToLog("service stopped");

}

void WINAPI ControlHandler(DWORD request)
{
 switch (request)
 {
 case SERVICE_CONTROL_STOP:
  running = FALSE;
  ServiceStatus.dwCurrentState = SERVICE_STOPPED;
  WriteToLog("service stopped");
  break;
 case SERVICE_CONTROL_SHUTDOWN:
  running = FALSE;
  ServiceStatus.dwCurrentState = SERVICE_STOPPED;
  WriteToLog("service shutdown");
  break;
 default:
  break;
 }

 SetServiceStatus(hStatus, &ServiceStatus);
}

int main()
{
 SERVICE_TABLE_ENTRY ServiceTable[] = { { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } };

 // 启动服务的控制分派机线程
 StartServiceCtrlDispatcher(ServiceTable);

 return 0;
}

2.安装Windows服务

由于本机用户权限问题,我建立了4个bat文件,分别是Install.bat(创建服务命令),Uninstall.bat(卸载服务命令,重启有效),Start.bat(启动服务命令),Stop.bat(停止服务命令),4个bat文件对应下面4个命令:sc create myserve binpath= E:\MyService\Debug\MyService.exe(exe文件地址);sc delete myserve;sc start myserve;sc stop myserve,用户可以鼠标右键选择以管理员身份运行,这样可以解决权限问题。

0 0
原创粉丝点击