C中创建服务源码!

    前段时间项目需要用到服务在后台运行,下面把相应的源码贴出来,以供后面学习!

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include <winuser.h>
#include <string>
#include <fstream>
using namespace std;

#define LOGFILE "C:\\log.txt"              // 信息输出文件  

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

void  ServiceMain(int argc, char** argv);  
void  CtrlHandler(DWORD request);  
int   InitService();  

void main()  
{  
    SERVICE_TABLE_ENTRY ServiceTable[2];  
    ServiceTable[0].lpServiceName="KeyOut";  
    ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;  
    ServiceTable[1].lpServiceName=NULL;  
    ServiceTable[1].lpServiceProc=NULL;  
    StartServiceCtrlDispatcher(ServiceTable);  
  
}

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

int InitService()   
{   
    OutputDebugString("Monitoring started.");  
    int result;  
    result = WriteToLog("Monitoring started.");  
    return(result);   
}  


void  CtrlHandler(DWORD request)  
{  
    switch (request)  
    {  
    case SERVICE_CONTROL_STOP:  
        OutputDebugString("Monitoring stopped.");  
        WriteToLog("Monitoring stopped.");  
  
        ServiceStatus.dwWin32ExitCode = 0;   
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;   
        SetServiceStatus (hStatus, &ServiceStatus);  
        return;  
    case SERVICE_CONTROL_SHUTDOWN:  
        OutputDebugString("Monitoring stopped.");  
        WriteToLog("Monitoring stopped.");  
  
        ServiceStatus.dwWin32ExitCode = 0;   
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;   
        SetServiceStatus (hStatus, &ServiceStatus);  
        return;  
    default:  
        break;  
    }  
    // Report current status  
    SetServiceStatus (hStatus, &ServiceStatus);  
    return;  
}  



void  ServiceMain(int argc, char** argv)  
{  
    int error;  
    ServiceStatus.dwServiceType =   SERVICE_WIN32;  
    ServiceStatus.dwCurrentState =  SERVICE_START_PENDING;  
    ServiceStatus.dwControlsAccepted =   SERVICE_ACCEPT_SHUTDOWN |   SERVICE_ACCEPT_STOP;
	//在本例中只接受系统关机和停止服务两种控制命令  
    ServiceStatus.dwWin32ExitCode = 0;  
    ServiceStatus.dwServiceSpecificExitCode = 0;  
    ServiceStatus.dwCheckPoint = 0;  
    ServiceStatus.dwWaitHint = 0;  
    hStatus = ::RegisterServiceCtrlHandler(  "MemoryStatus",   (LPHANDLER_FUNCTION)CtrlHandler);  
    if (hStatus == (SERVICE_STATUS_HANDLE)0)  
    {  
        WriteToLog("RegisterServiceCtrlHandler failed");  
        return;  
    }  
    WriteToLog("RegisterServiceCtrlHandler success");  
    // Initialize Service   
    error = InitService();  
    if (error)   
    {  
        // Initialization failed  
        ServiceStatus.dwCurrentState =   SERVICE_STOPPED;   
        ServiceStatus.dwWin32ExitCode = -1;   
        SetServiceStatus(hStatus, &ServiceStatus);   
        return;   
    }   
    // 向SCM 报告运行状态  
    ServiceStatus.dwCurrentState =   SERVICE_RUNNING;  
    SetServiceStatus (hStatus, &ServiceStatus);  

	string FileName = "E:/log.txt";
	string KeyName = "";
	fstream FileStream;
	FileStream.open(FileName.c_str(), std::fstream::out | std::fstream::app);
      
    while (ServiceStatus.dwCurrentState ==   SERVICE_RUNNING)  
    {  
		//函数主体,需要运作的!
    }  
    WriteToLog("service stopped");  
}  
   然后创建相应的脚本文件(.bat)即可!打开服务脚本件内容:
set b=%cd%
sc create GetKey binPath= "%b%\GetKey.exe" 
sc start GetKey
pause
:end
卸载服务脚本文件:

sc stop GetKey
sc delete GetKey
pause
:end 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值