1、注册服务

2、检测指定进程是否运行,如果没有运行,则运行进程

// WatchDogSvr.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"
#include "Windows.h" 
#include "tlhelp32.h"

SERVICE_STATUS m_ServiceStatus; 
SERVICE_STATUS_HANDLE m_ServiceStatusHandle; 
BOOL bRunning=true; 
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv); 
void WINAPI ServiceCtrlHandler(DWORD Opcode); 
BOOL InstallService(); 
BOOL DeleteService(); 
const int nBufSize=512;

void WriteLog(const char* strLog)
{
FILE * fp;
fp=fopen("C:\\WatchDog.log","a");
if( fp==NULL ) return;

//fputs(strLog,fp);
fprintf(fp,"%s\n",strLog);

fclose(fp);
}

int GetProcessCount(const TCHAR* szExeName)
{
TCHAR sztarget[MAX_PATH];
lstrcpy(sztarget, szExeName);
CharLowerBuff(sztarget, MAX_PATH);

int count = 0;
PROCESSENTRY32 my;
HANDLE l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)l) != -1)
{
my.dwSize = sizeof(my);
if (Process32First(l, &my))
{
do
{
CharLowerBuff(my.szExeFile, MAX_PATH);
if (lstrcmp(sztarget, my.szExeFile) == 0)
{
count++;
}
}while (Process32Next(l, &my));
}
CloseHandle(l);
}

return count;
}

void RunServiceProcess(const TCHAR *strServiceName)
{
//清空结构
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
ZeroMemory(&sInfo,sizeof(sInfo));
sInfo.cb=sizeof(sInfo);
sInfo.dwFlags=STARTF_USESHOWWINDOW;
sInfo.wShowWindow=SW_SHOWNORMAL;

ZeroMemory(&pInfo,sizeof(pInfo));

//输出出错信息
char chBuf[nBufSize];
ZeroMemory(chBuf,nBufSize);

//创建一个进程
if(!::CreateProcess(strServiceName,NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&sInfo,
&pInfo))
{
sprintf(chBuf,"CreateProcess failed(%d).\n",GetLastError());
WriteLog(chBuf);

return;
}

// Wait until child process exits.
WaitForSingleObject(pInfo.hProcess,INFINITE);

//关闭进程和线程的句柄
CloseHandle(pInfo.hProcess);
CloseHandle(pInfo.hThread);
}

void DoTask() 
{
if( GetProcessCount(_T("SjkDataCollect.exe"))==0)
{
RunServiceProcess(_T("C:\\xxx.exe"));
WriteLog("can not find process [SjkDataCollect.exe] and run process!");
}
}

int _tmain(int argc, _TCHAR* argv[])
{

if(argc>1) 

if( wcscmp(argv[1],L"-i")==0) 

if(InstallService()) 
printf("\n Service Installed Sucessfully\n"); 
else 
printf("\n Service has been installed\n"); 

else if(wcscmp(argv[1],L"-d")==0) 

if(DeleteService()) 
printf("\n Service UnInstalled Sucessfully\n"); 
else 
printf("\nInstalled Easin Central Service Not Found\n"); 
}
else 

printf("\nUnknown Switch Usage\nFor Install use Servicetest -i\nFor UnInstall use Servicetest -d\n"); 


else 

SERVICE_TABLE_ENTRY DispatchTable[]={{L"WatchDogSvr",ServiceMain},{NULL,NULL}};   
StartServiceCtrlDispatcher(DispatchTable);  
}

return 0; 
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) 

//     DWORD status;  
//     DWORD specificError;  
m_ServiceStatus.dwServiceType          = SERVICE_WIN32;  
m_ServiceStatus.dwCurrentState         = SERVICE_START_PENDING;  
m_ServiceStatus.dwControlsAccepted     = SERVICE_ACCEPT_STOP;  
m_ServiceStatus.dwWin32ExitCode        = 0;  
m_ServiceStatus.dwServiceSpecificExitCode = 0;  
m_ServiceStatus.dwCheckPoint           = 0;  
m_ServiceStatus.dwWaitHint             = 0;

m_ServiceStatusHandle = RegisterServiceCtrlHandler(L"WatchDogSvr",ServiceCtrlHandler);   
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)  
{  
return;  
}      
m_ServiceStatus.dwCurrentState         = SERVICE_RUNNING;  
m_ServiceStatus.dwCheckPoint           = 0;  
m_ServiceStatus.dwWaitHint             = 0;   
if (!SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus))  
{  
}

bRunning=true; 
while(bRunning) 
{    
Sleep(3000); 
//Place Your Code for processing here....   
DoTask(); 

return;  
}

void WINAPI ServiceCtrlHandler(DWORD Opcode) 

switch(Opcode)  
{  
case SERVICE_CONTROL_PAUSE:  
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;  
break;

case SERVICE_CONTROL_CONTINUE:  
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;  
break;

case SERVICE_CONTROL_STOP:  
m_ServiceStatus.dwWin32ExitCode = 0;  
m_ServiceStatus.dwCurrentState    = SERVICE_STOPPED;     
m_ServiceStatus.dwCheckPoint      = 0;  
m_ServiceStatus.dwWaitHint        = 0;     
SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus); 
bRunning=false; 
break;

case SERVICE_CONTROL_INTERROGATE:  
break;  
}       
return;  

BOOL InstallService() 

WCHAR strDir[1024]; 
SC_HANDLE schSCManager,schService; 
GetCurrentDirectory(1024,strDir); 
lstrcat(strDir,L"\\WatchDogSvr.exe");  
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

if (schSCManager == NULL)  
return false; 
LPCTSTR lpszBinaryPathName=strDir;

schService = CreateService((struct SC_HANDLE__ *)schSCManager,L"WatchDogSvr",L"WatchDogSvr",             // service name to display  
SERVICE_ALL_ACCESS,          // desired access  
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, // service type  
SERVICE_AUTO_START,        // start type  
SERVICE_ERROR_NORMAL,        // error control type  
lpszBinaryPathName,          // service's binary  
NULL,                        // no load ordering group  
NULL,                        // no tag identifier  
NULL,                        // no dependencies  
NULL,                        // LocalSystem account  
NULL);                       // no password

if (schService == NULL)  
return false;   
SERVICE_DESCRIPTION   sdBuf; 
sdBuf.lpDescription   =   L"深基坑后台服务"; 
ChangeServiceConfig2( schService, SERVICE_CONFIG_DESCRIPTION, &sdBuf);

CloseServiceHandle((struct SC_HANDLE__ *)schService);  
return true; 
}

BOOL DeleteService() 

HANDLE schSCManager; 
SC_HANDLE hService; 
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

if (schSCManager == NULL)  
return false;  
hService=OpenService((struct SC_HANDLE__ *)schSCManager,L"WatchDogSvr",SERVICE_ALL_ACCESS); 
if (hService == NULL)  
return false; 
if(DeleteService(hService)==0) 
return false; 
if(CloseServiceHandle(hService)==0) 
return false; 
else 
return true; 
}

C++看门狗服务程序(代码)相关推荐

  1. C8051关闭看门狗汇编语言,汇编写启动代码之关看门狗

    1 什么是看门狗? 看门狗(watch dog timer 看门狗定时器).大家想象这样一个场景:家门口有一只狗,这个狗定时会饿(譬如说2小时一饿),够饿了会胡乱咬死人.人进进出出要想保证安全必须提前 ...

  2. 《嵌入式 – GD32开发实战指南》第17章 看门狗

    开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK GD32 有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看 ...

  3. STM32中的独立看门狗和窗口看门狗

    STM32中的独立看门狗和窗口看门狗 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况.为了避免这种情况的出现,后期的MCU都集成了看门狗的功能.但是,目前看门狗发展到今天 ...

  4. stm32 看门狗 BKP(HAL库)

    (一)概述 stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1). (二)硬件看门狗实现代码 IWDG_HandleTypeDef hiwdg;// 硬件看门 ...

  5. 关于单片机看门狗的浅谈理解

    单片机中所谓"看门狗",本质上就是一个计时器,主要作用就是用来防止代码卡死或跑飞,在单片机的应用中十分重要,但使用时却是十分简单方便的. 按字面意思理解,跟看家护院的狗狗是一个意思 ...

  6. 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本

    1.汇编写启动代码:关看门狗 什么是看门狗? 看门狗(watch dog timer看门狗定时器),比如:家门口有一只狗,这个狗定时会饿(譬如两小时一饿),狗饿了就会胡乱咬人,人进进出出要想保证安全必 ...

  7. 初学STM32之看门狗

    初学STM32之看门狗 一.看门狗概述 1.什么是看门狗 单片机在工作中常常会受到来自外界电磁场的干扰,造成程序跑飞,而陷入死循环,程序的正常运行被打断,使得系统无法正常工作,造成整个系统陷入停滞状态 ...

  8. STM32开发(11)----CubeMX配置独立看门狗(IWDG)

    CubeMX配置独立看门狗(IWDG) 前言 一.独立看门狗的介绍 二.实验过程 1.STM32CubeMX配置独立看门狗 2.代码实现 3.硬件连接 4.实验结果 总结 前言 本章介绍使用STM32 ...

  9. Python 看门狗功能实现

    前言: 用 python 实时实现监控一个文件夹功能,将监控到的 Excel(笔者目前用于解析excel文件)解析写到 mysql 中,起功能和 sparkStreaming 中的 textFileS ...

最新文章

  1. 出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良
  2. 论文Fast and accurate short read alignment with Burrows-Wheeler transform
  3. python 类的继承,类中的函数调用以及类输入数组
  4. Maven修改默认本地资源库文件夹
  5. ios的 UIButton
  6. stripslashes和addslashes的区别
  7. JavaScript通用表单验证函数
  8. 一加8 Lite或将搭载联发科天玑1000:支持SA、NSA双模5G
  9. java simpleentry_使用Java流生成对象
  10. redis学习笔记---java操作redis,使用expire模拟指定时间段内限制ip访问的次数;
  11. Java HttpServlet 详解
  12. 离散数学4_第5章关系与函数__关系矩阵
  13. 科技爱好者如何避免成为“民科”,以及为何科技爱好团体必须杜绝“民科”现象...
  14. 华为机试(Python)真题Od【A卷+B卷】
  15. [Minecraft]基于Forge的1.8.9MOD开发教程——第二讲:创建一个空Mod
  16. BUUCTF-WEB 【0CTF 2016】piapiapia 1
  17. 低功耗产品ADC精确测量电池电压(电量)
  18. 批量修改文件夹下文件的名字
  19. 电脑鼠标如何进行维护
  20. openpyxl单元格居中

热门文章

  1. indesign选中不了图片删除_公众号文章排版,如何让两张图片并排显示?
  2. kali权限提升之配置不当提权与WCE
  3. HTML 里面的图片怎么移动位置?
  4. 引用sun.management.ManagementFactory出错的解决办法
  5. 机器人运动学与动力学入门(一)自由度与连杆机构
  6. 基于vue的可视化大屏开发
  7. Deep-Image-Analogy编译
  8. asp网站在IIS布局
  9. educoder web程序设计基础知识点 期末总结
  10. 笔记本锂离子电池的激活保养