Windows系统服务创建步骤,常用类封装,废话不多说,直接上代码

 // ServceDemo.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "WindwosService.h" unsigned __stdcall SvcRun (void *Params )
{
while()
{ for (int i = ;i < ;i++)
{
printf("%d\n",i);
} ::Sleep(**);
}
return ;
} int _tmain(int argc, _TCHAR* argv[])
{
#ifdef WIN32
InitService(argc,argv);
#endif // WIN32 #ifdef linux #endif // linux return ;
}

main函数文件代码

 #if !defined JX_About_Privilege
#define JX_About_Privilege #include <Windows.h>
// Windows提权类
class JXAboutPrivilege
{
public:
JXAboutPrivilege(void);
~JXAboutPrivilege(void);
// 提升关机权限
static BOOL EnableShutdownPrivileges( VOID );
// 提升结束进程的权限
static BOOL EnableTermProcessPrivileges( VOID );
// 提升加载驱动的权限
static BOOL EnableLoadDriverPrivileges( VOID ); static BOOL EnableDebugPrivilege(BOOL fEnable);
}; #endif

JXAboutPrivilege.h

 #include "StdAfx.h"
#include "JXAboutPrivilege.h" JXAboutPrivilege::JXAboutPrivilege(void)
{
} JXAboutPrivilege::~JXAboutPrivilege(void)
{
} BOOL JXAboutPrivilege::EnableShutdownPrivileges( VOID )
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL Result = FALSE; if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
return FALSE; LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &(tkp.Privileges[].Luid) );
tkp.PrivilegeCount = ;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, );
DWORD dwError = GetLastError();
if ( ERROR_SUCCESS == dwError )
Result = TRUE; CloseHandle( hToken );
return Result;
} BOOL JXAboutPrivilege::EnableTermProcessPrivileges( VOID )
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL Result = FALSE; if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
return FALSE; LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &(tkp.Privileges[].Luid) );
tkp.PrivilegeCount = ;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, );
DWORD dwError = GetLastError();
if ( ERROR_SUCCESS == dwError )
Result = TRUE; CloseHandle( hToken );
return Result;
} BOOL JXAboutPrivilege::EnableLoadDriverPrivileges( VOID )
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL Result = FALSE; if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
return FALSE; LookupPrivilegeValue( NULL, SE_LOAD_DRIVER_NAME, &(tkp.Privileges[].Luid) );
tkp.PrivilegeCount = ;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, );
DWORD dwError = GetLastError();
if ( ERROR_SUCCESS == dwError )
Result = TRUE; CloseHandle( hToken );
return Result;
} BOOL JXAboutPrivilege::EnableDebugPrivilege(BOOL fEnable)
{
BOOL fOk = FALSE; // Assume function fails
HANDLE hToken;
// Try to open this process's access token
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
// Attempt to modify the "Debug" privilege
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = ;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[].Luid);
tp.Privileges[].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : ;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return(fOk);
}

JXAboutPrivilege.cpp

 #if !defined JX_Service_Control
#define JX_Service_Control
#include <Windows.h> // Windows服务控制类
class JXServiceControl
{
public:
JXServiceControl(void);
~JXServiceControl(void);
public:
int ChangeServicePath( );
int createService();
int deleteService();
void startService();
void stopService();
BOOL isSvsRuning();
BOOL isSvsExist();
//设置服务名
void SetServiceName(const char * str);
//设置服务管理面板显示名字
void SetServiceShowName(const char *str);
//设置服务EXE文件位置
void SetExePath(const char *str);
private:
//服务名
char sSname[MAX_PATH+];
//服务Caption
char sShowName[MAX_PATH+];
//服务可执行文件路径
char sSvcExePath[MAX_PATH+];
}; #endif

JXServiceControl.h

WindwosService.h
 #include "WindwosService.h"

 SERVICE_STATUS ServiceStatus = {};
SERVICE_STATUS_HANDLE hStatus = NULL; void Run()
{
_beginthreadex(NULL, NULL, SvcRun, NULL, NULL, NULL);
} void WINAPI ControlHandler(DWORD fdwControl)
{
switch(fdwControl)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
ServiceStatus.dwWin32ExitCode = ;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
default: break;
}
SetServiceStatus(hStatus, &ServiceStatus);
} void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
{ ZeroMemory(&ServiceStatus, sizeof(ServiceStatus));
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;// 正在启动中...
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; hStatus = RegisterServiceCtrlHandler(SERVER_NAME, (LPHANDLER_FUNCTION)ControlHandler); // 注册当前服务的控制函数
if (!hStatus)
{
OutputDebugString(" RegisterServiceCtrlHandler 失败....\n");
return;
}
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);// 修改服务状态
//////////////////////下方为启动主线程/////////////////////////////////////////
Run();
//////////////////////////////////////////////////////////////////////////
while()
{
::Sleep();
}
//::WaitForSingleObject(hThread,INFINITE); // 等待线程结束
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -;
SetServiceStatus(hStatus, &ServiceStatus);
} int InitService(int argc, TCHAR* argv[])
{
JXAboutPrivilege::EnableDebugPrivilege(TRUE);
JXAboutPrivilege::EnableLoadDriverPrivileges();
JXAboutPrivilege::EnableShutdownPrivileges();
JXAboutPrivilege::EnableTermProcessPrivileges(); if (argc == )
{
if (!stricmp(argv[],("-install")))
{
// InstallServices();
return ;
}
if (!stricmp(argv[], ("-uninstall")))
{
// UnInstallServices();
return ;
}
if (!stricmp(argv[], ("-run")))
{
Run();
while (TRUE)
Sleep();
return ;
}
}
SERVICE_TABLE_ENTRY DispatchTable[] = {
{ SERVER_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
}; StartServiceCtrlDispatcher(DispatchTable);
} void InstallServices()
{
TCHAR path_nor[MAX_PATH] = { };
GetModuleFileName(NULL, path_nor, MAX_PATH); JXServiceControl sc;
sc.SetExePath(path_nor);
sc.SetServiceName((SERVER_NAME));
sc.SetServiceShowName((SERVER_NAME)); if ( sc.isSvsExist() && sc.isSvsRuning() )
{
sc.stopService();
sc.ChangeServicePath();
}
else if ( sc.isSvsExist() )
{
sc.ChangeServicePath();
}
else if (!sc.isSvsExist())
{
sc.createService();
} sc.startService();
} void UnInstallServices()
{
TCHAR path_nor[MAX_PATH] = { };
GetModuleFileName(NULL, path_nor, MAX_PATH); JXServiceControl sc;
sc.SetExePath(path_nor);
sc.SetServiceName((SERVER_NAME));
sc.SetServiceShowName((SERVER_NAME)); if ( sc.isSvsExist() && sc.isSvsRuning() )
{
sc.stopService();
}
if( sc.isSvsExist() )
sc.deleteService();
}

WindwosService.cpp

 #include "StdAfx.h"
#include "JXServiceControl.h" JXServiceControl::JXServiceControl(void)
{
memset(sSname,,MAX_PATH);
memset(sShowName,,MAX_PATH);
memset(sSvcExePath,,MAX_PATH);
} JXServiceControl::~JXServiceControl(void)
{ } int JXServiceControl::ChangeServicePath()
{
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
SC_HANDLE hsev = NULL;
if(scHandle != NULL)
{
hsev = OpenService(scHandle,sSname,SERVICE_ALL_ACCESS);
if(hsev != NULL)
{
BOOL bRet = ChangeServiceConfig(
hsev,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
sSvcExePath,
NULL,
NULL,
NULL,
NULL,
NULL,
sShowName
);
CloseServiceHandle(hsev); }
else
{
CloseServiceHandle(scHandle);
return ;
}
CloseServiceHandle(scHandle);
}
else
return -; return ;
} int JXServiceControl::createService()
{
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
if (scHandle == NULL)
{
return -;
}
SC_HANDLE hsvc = CreateService(scHandle,sSname,sShowName,SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,sSvcExePath,
NULL,NULL,NULL,NULL,NULL);
if (hsvc != NULL)
{
CloseServiceHandle(hsvc);
}
else
{
return ;
}
CloseServiceHandle(scHandle);
return ;
} int JXServiceControl::deleteService()
{
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
SC_HANDLE hsev = NULL;
if(scHandle != NULL)
{
hsev = OpenService(scHandle,sSname,SERVICE_ALL_ACCESS);
SERVICE_STATUS mss;
if(hsev != NULL)
{
QueryServiceStatus(hsev,&mss);
if (mss.dwCurrentState != SERVICE_RUNNING)
{
ControlService(hsev,SERVICE_CONTROL_STOP,&mss);
DeleteService(hsev); }
CloseServiceHandle(hsev);
} else
{
CloseServiceHandle(scHandle);
return ;
}
CloseServiceHandle(scHandle);
}
else return -;
return ;
} void JXServiceControl::startService()
{
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
SC_HANDLE hscv = NULL;
if (scHandle != NULL)
{
hscv = OpenService(scHandle,sSname,SERVICE_START);
if(hscv != NULL)
{
BOOL isSucess = StartService(hscv,,NULL);
DWORD err = ;
if (isSucess == )
{
err = GetLastError();
}
CloseServiceHandle(hscv);
}
CloseServiceHandle(scHandle);
}
} void JXServiceControl::stopService()
{
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
SC_HANDLE hsev = NULL;
if(scHandle != NULL)
{
hsev = OpenService(scHandle,sSname,SERVICE_ALL_ACCESS);
SERVICE_STATUS mss;
if(hsev != NULL)
{
QueryServiceStatus(hsev,&mss);
if (mss.dwCurrentState == SERVICE_RUNNING)
{
ControlService(hsev,SERVICE_CONTROL_STOP,&mss);
CloseServiceHandle(hsev);
}
}
CloseServiceHandle(scHandle);
}
} BOOL JXServiceControl::isSvsRuning()
{
BOOL ret = FALSE;
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
SC_HANDLE hsev = NULL;
if(scHandle != NULL)
{
hsev = OpenService(scHandle,sSname,SERVICE_ALL_ACCESS);
SERVICE_STATUS mss;
if(hsev != NULL)
{
QueryServiceStatus(hsev,&mss);
if (mss.dwCurrentState == SERVICE_RUNNING)
{
ret = TRUE;
CloseServiceHandle(hsev);
} }
CloseServiceHandle(scHandle);
}
return ret;
} BOOL JXServiceControl::isSvsExist()
{
BOOL ret = FALSE;
SC_HANDLE scHandle = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
SC_HANDLE hsev = NULL;
if(scHandle != NULL)
{
hsev = OpenService(scHandle,sSname,SERVICE_ALL_ACCESS);
DWORD err = GetLastError();
if (err == ERROR_SERVICE_DOES_NOT_EXIST)
{
ret = FALSE;
}
else
{
ret = TRUE;
}
if(hsev != NULL)
{
CloseServiceHandle(hsev);
CloseServiceHandle(scHandle);
}
}
return ret;
} void JXServiceControl::SetServiceName(const char * str)
{
strcpy_s(sSname,MAX_PATH,str);
} void JXServiceControl::SetServiceShowName(const char *str)
{
strcpy_s(sShowName,MAX_PATH,str);
} void JXServiceControl::SetExePath(const char *str)
{
strcpy_s(sSvcExePath,MAX_PATH,str);
}

JXServiceControl.cpp

转载请注明出处....

代码栗子:http://pan.baidu.com/s/1WHQ5w

VC Windows系统服务创建代码的更多相关文章

  1. windows系统服务编程代码示例分享

    #include"XXXX.h" //包含的头文件 //定义全局函数变量 void Init(); BOOL IsInstalled(); BOOL Install(); BOOL ...

  2. 深入解析Windows窗体创建和消息分发

    Windows GUI採用基于事件驱动的编程模型,其实差点儿全部的界面库都是这样做的.在纯粹的Window32 SDK编程时代.人们还能够搞懂整个Windows窗口创建和消息的流通过程.可是在如今各种 ...

  3. 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good

    笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...

  4. C#-Windows服务创建和运行

    Windows服务创建和运行    适用场景: ASP.Net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码,所以我们需要构建自己的Windows服务来运行那些定时任务. 项目中需 ...

  5. VC Windows API获得桌面所有窗口句柄的方法

    VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之 ...

  6. MongoDB安装,启动,注册为windows系统服务

    MongoDB安装与启动 周建旭 2014-08-10 解压完后配置环境变量 下载Windows 32-bit或64-bit版本并解压缩,程序文件都在bin目录中,其它两个目录分别是C++调用是的头文 ...

  7. C#开发奇技淫巧一:调试windows系统服务

    原文:C#开发奇技淫巧一:调试windows系统服务 windows系统服务不能直接运行,只能在安装完服务之后启动.暂停.继续.停止服务,导致服务的调试不能使用一般的断点调试. 要调试系统服务,可以采 ...

  8. 安装windows服务批处理代码

    批处理是DOS时代比较常用的方法之一,目前来说也是一种高效的方法,复制代码到文本文件中,保存并修改文件扩展名为“*.bat”. 安装windows服务批处理代码如下: @echo off set fi ...

  9. Windows中创建桌面快捷方式

    Windows中创建桌面快捷方式 -------------- -------------- -------------- --------------

随机推荐

  1. arm的一些概念(ARM7、Cortex-M的区别)

    ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构.    ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能 ...

  2. 多目标遗传算法 ------ NSGA-II (部分源码解析)README 算法的部分英文解释

    This is the Readme file for NSGA-II code. About the Algorithm--------------------------------------- ...

  3. C语言学习笔记--结构体

    结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...

  4. WPS怎样设置多级标题(如四级标题)

    WPS期初,乍一看最多只能设置三级标题. 怎样设置四级以上标题呢? 这里以设置四级标题为例: 点击‘视图’->'大纲', 假如,现在2.3.3这一行是三级标题: 在下拉框里选择‘4级’就可以了. ...

  5. IIS 内部运行机制及Asp.Net执行过程详解

    一直以来对一个Asp.net页面穿过IIS后就返回给浏览器一个HTML页面感觉很是神奇.虽然做技术这么长时间了,也曾经大致了解过一点来龙去脉,但是如果你真的问起我比较详细的过程,我还真的回答不上来,好 ...

  6. UOJ 216 Jakarta Skyscrapers

    http://uoj.ac/problem/216 题意:给定A,B,C,如果集合中有数i,j(i>j),那么集合就会增加i-j这个数,问有没有在初始集合为{A,B}400步内生成C的方案. 思 ...

  7. Qt 窗体布局 good

    布局相关对象及简介 窗体上的所有的控件必须有一个合适的尺寸和位置.Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLa ...

  8. POJ2240 Arbitrage(最短路)

    题目链接. 题意: 根据汇率可以将一种金币换成其他的金币,求最后能否赚到比原来更多的金币. 分析: 最短路的求法,用floyd. #include <iostream> #include ...

  9. 设计模式(六):Singleton 单件模式 -- 创建型模式

    1.定义 当需要控制一个类的实例数量且调用者可以从一个公共的访问点访问时. 2.适用场景 1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2. 当这个唯一实例应该是通过子类化可扩 ...

  10. HBase Split

    Region Split请求是在Region MemStore Flush之后被触发的: boolean shouldCompact = region.flushcache(); // We just ...