安装windows服务

来源:互联网 发布:android aop 编程 编辑:程序博客网 时间:2024/06/14 11:55

------------------------------------------------------v2.0--------------------------------------------------------

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

//
//dos下运行    xxx.exe -r;卸载   xxxx.exe -i:安装
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

#define FILE_PATH  "c:\\log.txt"
#define SLEEP_TIME  5000


SERVICE_STATUS  m_ServiceStatus;
SERVICE_STATUS_HANDLE  m_ServiceStatusHandle;
MEMORYSTATUS memstatus;
char str[200];
int availmb;
void InstallCmdService();
void DelServices();
void WINAPI ServiceMain(int arg, char**argc);
void WINAPI ServiceCtrHandler(DWORD Opcode);
BOOL bRunning = TRUE;
int WriteToLog(char* str);
int _tmain(int argc, _TCHAR* argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[2];
if(argc == 2)
{
if(!stricmp(argv[1],"-i"))
{
InstallCmdService();
}else if(!stricmp(argv[1],"-r"))
{
DelServices();
}
return 0;
}

DispatchTable[0].lpServiceName = "demo";  //服务名称
DispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;//服务的主函数
DispatchTable[1].lpServiceName = NULL;//没有第二个服务。。。所以为NULL,其实可以有
DispatchTable[1].lpServiceName = NULL;

StartServiceCtrlDispatcher(DispatchTable);
return 0;
}

void WINAPI ServiceMain(int argc, char**argv)  //服务端主函数,会自动开辟一个线程
{
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
//注册服务控制函数

m_ServiceStatusHandle = RegisterServiceCtrlHandler("demo",ServiceCtrHandler);
if(m_ServiceStatusHandle == 0)
{
WriteToLog("RegisterServiceCtrlHandler failed!");
return;
}
WriteToLog("RegisterServiceCtrlHandler success!");
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
bRunning = TRUE;

memset(str,0,200);
while(bRunning)
{
//此处任你玩##¥%¥……%……*……
// GlobalMemoryStatus(&memstatus);
// availmb = memstatus.dwAvailPhys/1024/1024;
// sprintf_s(str,100,"available memory is %dMB",availmb);
// WriteToLog(str);
// Sleep(SLEEP_TIME);
}
WriteToLog("service stopped!");
}


void WINAPI ServiceCtrHandler(DWORD Opcode)//用于将服务程序装到服务控制面板里面去
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
bRunning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;


break;
case SERVICE_CONTROL_SHUTDOWN:
bRunning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);

}
int WriteToLog(char* str)
{
FILE* pfile;
fopen_s(&pfile,FILE_PATH,"a+");
if(pfile == NULL)
{
return -1;
}
fprintf_s(pfile,"%s\n",str);
fclose(pfile);
return 0;
}
void InstallCmdService()
{
char strDir[1024];
SC_HANDLE schSCManager,schService;
LPCTSTR lpszBinaryPathName;
GetCurrentDirectory(1024,strDir);
GetModuleFileName(NULL,strDir,sizeof(strDir));
lpszBinaryPathName = strDir;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(schSCManager == NULL)
{
printf("open scmanager failed, maybe you don't hava the privilege");
}
schService = CreateService(schSCManager,
"系统记录在数据库的ID",
"显示出来的在服务名字部分",
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
lpszBinaryPathName,
NULL,NULL,NULL,NULL,NULL
);
if(schService == NULL)
{
printf("faint, we failed just because we invoke createservice failed\n");
return ;
}

CloseServiceHandle(schService);
}
void DelServices()
{
char name[100];
SC_HANDLE scm;
SC_HANDLE service;
SERVICE_STATUS status;
BOOL isSuccess;
strcpy(name,"Winodw");
if((scm = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE)) == NULL)
{
printf("OpenSCManager ERROR");
return;
}
service = OpenService(scm,name,SERVICE_ALL_ACCESS|DELETE);
if(!service)
{
printf("Openservice error");
return;
}
isSuccess = QueryServiceStatus(service,&status);
if(!isSuccess)
{
printf(" QueryServiceStatus error!");
return;
}
if(status.dwCurrentState != SERVICE_STOPPED)
{
isSuccess = ControlService(service,SERVICE_CONTROL_STOP,&status);
if(!isSuccess)
{
printf("stop service error!");
return;
}
}
isSuccess = DeleteService(service);
if(!isSuccess)
{
printf("Delete Service Fail!");
}else
{
printf("Delete Service Success!");
}
CloseServiceHandle(service);

CloseServiceHandle(scm);

}

---------------------------------------------v1.0----------------------------------------------------------

// demo.cpp : 定义控制台应用程序的入口点。
//
//可以把WriteToLog函数删除掉,这是写日志文件函数。
//编译器直接编译,生成的xxx.exe文件不能运行,需要sc.exe工具安装到操作系统
//或者用代码编写服务安装程序和删除程序,安装删除更加方便
//只需要将xx的代码放到ServiceMain()的while循环体内即可
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define FILE_PATH  "c:\\log.txt"
#define SLEEP_TIME  5000

SERVICE_STATUS  m_ServiceStatus;
SERVICE_STATUS_HANDLE  m_ServiceStatusHandle;

MEMORYSTATUS memstatus;
char str[200];
int availmb;
void WINAPI ServiceMain(int arg, char**argc);
void WINAPI ServiceCtrHandler(DWORD Opcode);
BOOL bRunning = TRUE;
int WriteToLog(char* str);
int _tmain(int argc, _TCHAR* argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[2];
DispatchTable[0].lpServiceName = (LPWSTR)"demo";  //服务名称
DispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;//服务的主函数
DispatchTable[1].lpServiceName = NULL;//没有第二个服务。。。所以为NULL,其实可以有
DispatchTable[1].lpServiceName = NULL;

StartServiceCtrlDispatcher(DispatchTable);
return 0;
}

void WINAPI ServiceMain(int argc, char**argv)  //服务端主函数,会自动开辟一个线程
{

m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
//注册服务控制函数

m_ServiceStatusHandle = RegisterServiceCtrlHandler((LPCWSTR)"demo",ServiceCtrHandler);
if(m_ServiceStatusHandle == 0)
{
WriteToLog("RegisterServiceCtrlHandler failed!");
return;
}
WriteToLog("RegisterServiceCtrlHandler success!");
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
bRunning = TRUE;

memset(str,0,200);
while(bRunning)
{
//在此编写xx代码
}
WriteToLog("service stopped!");

}

void WINAPI ServiceCtrHandler(DWORD Opcode)//用于将服务程序装到服务控制面板里面去
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
bRunning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;

break;
case SERVICE_CONTROL_SHUTDOWN:
bRunning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);

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

0 0
原创粉丝点击