代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
写Windows服务
作者:
mousekitty
/ 发布于
2014/3/11
/
900
写Windows服务
第一步:新建Windows服务项目NiPoint(VS2005) 新建成功后,系统会自动产生文件如下文件: 源文件:NiPointWinService.cpp 头文件:NiPointWinService.h和NiPointWinService.resX 第二步:修改NiPointWinService.h 功能: 隔10秒取扫描进程rundll32.exe是否存在,如果存在,则休眠10秒,如果不存在,则重启rundll32.exe 说明: 1. 在OnStart方法中,使用了_beginthreadex启动一个线程ProtectRundll32Process去定时扫描rundll32.exe是否存在,不能将ProtectRundll32Process中的代码直接写在OnStart中,否则会导致服务的启动状态一直是Start Pending,而不是Running 2. 在InitializeComponent方法中,通过this->CanStop = false;使此服务不能停止 3. 服务的OnStop只有当this->CanStop = true;时才有效。下面的代码中,因为this->CanStop = false;,因此OnStop中的代码永远不会执行 4. 即使this->CanStop = true;,但当用户在任务管理器中杀掉此服务的进程,也无法触发OnStop事件,因为OnStop事件只有正常停止才能触发。杀掉进程时触发事件的代码应该用Hook,但我一直没找到。 操作: 切换到NiPointWinService.h的代码视图,具体代码如下: #pragma once #include #include #include #include #include #include #include using namespace std; using namespace System; using namespace System::Collections; using namespace System::ServiceProcess; using namespace System::ComponentModel; namespace NiPoint { /// /// NiPointWinService 摘要 /// /// /// 警告: 如果更改此类的名称,则需要更改 /// 与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的 /// “资源文件名”属性。否则, /// 设计器将不能与此窗体的关联 /// 本地化资源正确交互。 public ref class NiPointWinService : public System::ServiceProcess::ServiceBase { public: NiPointWinService() { InitializeComponent(); } protected: /// /// 清理所有正在使用的资源。 /// ~NiPointWinService() { if (components) { delete components; } } static const DWORD dwSleepTime = 10000; static DWORD dwProId = 0; /// /// 产生rundll32.exe进程 /// static DWORD CreateRundll32Process() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); DWORD dwProId = 0; if (CreateProcess(NULL, // No module name (use command line) "rundll32.exe niagentstart.dll,autorun", // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) { //创建rundll32.exe进程成功 dwProId = pi.dwProcessId; } else { HANDLE hProcess = GetCurrentProcess();//get current process TerminateProcess(hProcess,0); //close process } return dwProId; } /// /// 查找产生的rundll32.exe进程 /// static bool FindRundll32Process(DWORD dwProId) { //取得系统中所有进程 HANDLE hProcessSnap = NULL; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if(hProcessSnap == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot调用失败!"); Sleep(dwSleepTime); return false; } //定义进程信息结构体 PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); //循环所有系统进程,找到当前进程 bool bRunning = false; BOOL bEnd = Process32First(hProcessSnap, &pe); while (bEnd) { if (pe.th32ProcessID == dwProId) { bRunning = true; break; } bEnd = Process32Next(hProcessSnap, &pe); } CloseHandle(hProcessSnap); return bRunning; } /// /// 守护rundll32.exe进程 /// static unsigned __clrcall ProtectRundll32Process(void *mArgclist) { while(true) { if(dwProId == 0) { //进程没有启动,启动进程 dwProId = CreateRundll32Process(); } else { //进程已经启动,判断系统进程中是否有所启动的进程,如果没有,重新启动rundll32,如果有Sleep //判断系统进程中是否有所启动的进程 bool bRunning = FindRundll32Process(dwProId); if (!bRunning) { //没有找到对应进程,需要重新启动rundll32 dwProId = CreateRundll32Process(); } } Sleep(dwSleepTime); } } /// /// 启动保护Rundll32.exe的进程 /// virtual void OnStart(array<String^>^ args) override { HANDLE hThread; unsigned int threadid; agrclist magrclist,*pmagrclist; char buf[128]; pmagrclist=&magrclist; pmagrclist->data=buf; pmagrclist->count=1; hThread=(HANDLE)_beginthreadex(NULL,0,&ProtectRundll32Process,pmagrclist,NULL,&threadid); CloseHandle(hThread); } /// /// 停止此服务时,需杀掉对应的Rundll32.exe的进程 /// virtual void OnStop() override { //bool bRunning = FindRundll32Process(dwProId); if (dwProId != 0) { //找到对应的rundll32.exe进程,需要杀掉进程 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProId); if(hProcess != NULL) { TerminateProcess(hProcess,0); CloseHandle(hProcess); } } } private: /// /// 必需的设计器变量。 /// System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// void InitializeComponent(void) { this->components = gcnew System::ComponentModel::Container(); this->CanStop = false; this->CanPauseAndContinue = true; this->AutoLog = true; this->ServiceName = L"nipoint"; } #pragma endregion }; } 第三步:我是使用的windows命令新建启动的服务,代码如下 注册启动服务代码: sc create nipoint binpath= "%programfiles%\NIAgent\nipoint.exe" sc config nipoint type= interact type= own start= auto sc start nipoint 停止删除服务代码: sc stop nipoint sc delete nipoint
试试其它关键字
Windows服务
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
mousekitty
贡献的其它代码
(
13
)
.
MouseClick事件触发右键菜单
.
通过SetupAPI扫描/禁用/恢复设备
.
利用WebService下载文件
.
遍历文件夹得到所有文件
.
写Windows服务
.
截屏(基于MFC)
.
截取Char[]
.
Java Socket多线程——服务器端
.
List和String互相转换
.
自定义函数Split
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3