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. linux内核移植 I

    根据tx2440的文档, 目标也比较简单, 先编译成功, 再烧录, 根文件系统, busybox 这些. A. 准备 1. 解压tar, 修改根Makefile ARCH ?= arm CROSS_C ...

  2. Javascript返回顶部

    控制按钮下拉到达一定距离时显示,返回顶层时消失,用JS中的延时定时器来模拟滚动条效果 <script type="text/javascript"> window.on ...

  3. 终端编写c程序

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:JackAlan链接:http://www.zhihu.com/question/21483375/answer/322672 ...

  4. 7月12日至芯FPGA就业班招生

    至芯科技FPGA就业培训班将于2014年7月12日正式开班,届时至芯科技将秉承着一贯的教学传统,为广大师生打造一个专业的技术平台和轻松的学习环境. 在夏宇闻教授的带领下,至芯科技汇聚了一批来自国内外大 ...

  5. Detours简介 (拦截x86机器上的任意的win32 API函数)

    Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Det ...

  6. 【HDOJ】2492 Ping pong

    线段树+离散化. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 2000 ...

  7. JS线程模型&Web Worker

    js线程模型 客户端javascript是单线程,浏览器无法同时运行两个事件处理程序 设计为单线程的理论是,客户端的javascript函数必须不能运行太长时间,否则会导致web浏览器无法对用户输入做 ...

  8. html幻灯效果页面

    方式一: <!DOCTYPE HTML> <html> <head> <style> #cont { position: relative; heigh ...

  9. KMP学习

    刚才看了(连接)写的翻译,把kmp算法的工作过程讲的很不错,kmp算法的核心是next,next为什么要那么赋值?其实就是前缀和后缀的最大匹配值,用这个值在匹配失败的时候可以跳过一个不必要的匹配.   ...

  10. Struts2初学习记录

    以下笔记内容来自尚硅谷_Struts2_佟刚老师的视频教程+自己一点点整理 来源免责声明 一. 1. VS 自实现: 1). 搭建 Struts2 的开发环境 2). 不需要显式的定义 Filter, ...