VC Windows系统服务创建代码
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
#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系统服务创建代码的更多相关文章
- windows系统服务编程代码示例分享
#include"XXXX.h" //包含的头文件 //定义全局函数变量 void Init(); BOOL IsInstalled(); BOOL Install(); BOOL ...
- 深入解析Windows窗体创建和消息分发
Windows GUI採用基于事件驱动的编程模型,其实差点儿全部的界面库都是这样做的.在纯粹的Window32 SDK编程时代.人们还能够搞懂整个Windows窗口创建和消息的流通过程.可是在如今各种 ...
- 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good
笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...
- C#-Windows服务创建和运行
Windows服务创建和运行 适用场景: ASP.Net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码,所以我们需要构建自己的Windows服务来运行那些定时任务. 项目中需 ...
- VC Windows API获得桌面所有窗口句柄的方法
VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之 ...
- MongoDB安装,启动,注册为windows系统服务
MongoDB安装与启动 周建旭 2014-08-10 解压完后配置环境变量 下载Windows 32-bit或64-bit版本并解压缩,程序文件都在bin目录中,其它两个目录分别是C++调用是的头文 ...
- C#开发奇技淫巧一:调试windows系统服务
原文:C#开发奇技淫巧一:调试windows系统服务 windows系统服务不能直接运行,只能在安装完服务之后启动.暂停.继续.停止服务,导致服务的调试不能使用一般的断点调试. 要调试系统服务,可以采 ...
- 安装windows服务批处理代码
批处理是DOS时代比较常用的方法之一,目前来说也是一种高效的方法,复制代码到文本文件中,保存并修改文件扩展名为“*.bat”. 安装windows服务批处理代码如下: @echo off set fi ...
- Windows中创建桌面快捷方式
Windows中创建桌面快捷方式 -------------- -------------- -------------- --------------
随机推荐
- Xcode can't verify the identity of the server
当升级了苹果系统到 OS X El Captain 之后 ,打开Xcode 有时候会报错 如图 而且打开 svn 也会出类似错误 点击continue 了 下次 还会 出现 .这个很好解决 ...
- Android应用开发学习笔记之多线程与Handler消息处理机制
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...
- Linux2.6内核--对块IO层操作的讨论
当一个块被调入内存时(也就是说,在读入后或等待写出时),它要存储在缓冲区中.每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示.块包含一个或多个扇区,但大小不能超过一页,所以一页可以容 ...
- Miller_Rabin素数判断,rho
safe保险一点5吧.我是MR: ; int gcd(int a,int b){return !b?a:gcd(b,a%b);} int mul(int a,int b,int p){ )*p); ? ...
- 【动态规划】Codeforces 706C Hard problem
题目链接: http://codeforces.com/contest/706/problem/C 题目大意: n(2 ≤ n ≤ 100 000)个字符串(长度不超过100000),翻转费用为Ci( ...
- Delphi String 与wideString 的完美转换
一般来说,String与widestring 的转换是系统自动进行的,但是,考虑如下字符串 s:=#2+#3+#0+#10+#0+#1+#164+#59;,显然S的长度为8,然后执行如下代码 var ...
- cf591B Rebranding
B. Rebranding time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- java的异常处理简介
异常概述 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等. 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生. 对于这些错误,一 ...
- 通过jdbc取得数据库表结构信息
做制作开发平台时,首要的一点是如何取得数据库表结构信息.一般通用的做法就是通过JDBC中的ResultSetMetaData类来进行操作,当你取得了数据库表结构信息后,比如说表的每个字段名称,字段类型 ...
- 深入理解javascript之this
javascript中的this含义很丰富,它能够是全局对象,当前对象或者是随意对象,这都取决于函数的调用方式.函数有下面几种调用方式:作为对象方法调用.作为函数调用.作为构造函数调用.apply或c ...