#include <windows.h>
#include <iostream>
using namespace std;
// 定义服务的名称和状态:
#define SERVICE_NAME (char*)"ServiceDemo"
SERVICE_STATUS g_ServiceStatus = { 0 };
SERVICE_STATUS_HANDLE g_StatusHandle = NULL;
HANDLE g_ServiceStopEvent = INVALID_HANDLE_VALUE;
static volatile int ServiceMain_Exit = 0;
VOID WINAPI ServiceMain(DWORD argc, LPSTR* argv);
VOID WINAPI ServiceCtrlHandler(DWORD);
DWORD WINAPI ServiceWorkerThread(LPVOID lpParam);
void UninstallService(LPCTSTR lpServiceName);
void InstallService(LPCSTR lpServiceName, LPCSTR lpDisplayName, LPCSTR lpBinaryPath);
/*
* 或者在命令行中以此命令创建,开始,停止,删除服务
* sc create ServiceDemo binpath= C:\Users\ALVA\Desktop\新建文件夹\ServiceDemo\Debug\ServiceDemo.exe
* sc start ServiceDemo
* sc stop ServiceDemo
* sc delete ServiceDemo
*/
int main(int argc, char** argv)
{
std::cout << SERVICE_NAME << ": Main: Entry" << std::endl;
if (argc == 2) {
if (strcmp(argv[1], "install") == 0) {
std::cout << SERVICE_NAME << ": Main: install" << std::endl;
InstallService(SERVICE_NAME, SERVICE_NAME, "C:\\Users\\ALVA\\Desktop\\新建文件夹\\ServiceDemo\\Debug\\ServiceDemo.exe"); // 可在exe之后跟参数
}
else if (strcmp(argv[1], "uninstall") == 0) {
std::cout << SERVICE_NAME << ": Main: uninstall" << std::endl;
UninstallService(SERVICE_NAME);
}
}
else {
std::cout << SERVICE_NAME << ": Main: 请使用管理员命令行运行" << std::endl;
SERVICE_TABLE_ENTRY ServiceTable[] =
{
{ SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
if (StartServiceCtrlDispatcher(ServiceTable) == FALSE)
{
std::cout << SERVICE_NAME << ": Main: StartServiceCtrlDispatcher returned error" << std::endl;
return GetLastError();
}
}
std::cout << SERVICE_NAME << ": Main: Exit" << std::endl;
return 0;
}
VOID WINAPI ServiceMain(DWORD argc, LPSTR* argv)
{
std::cout << SERVICE_NAME << ": ServiceMain: Entry" << std::endl;
HANDLE hThread;
DWORD Status = E_FAIL;
g_StatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceCtrlHandler);
if (g_StatusHandle == NULL)
{
std::cout << SERVICE_NAME << ": ServiceMain: RegisterServiceCtrlHandler returned error" << std::endl;
goto EXIT;
}
// Tell the service controller we are starting
ZeroMemory(&g_ServiceStatus, sizeof(g_ServiceStatus));
g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
g_ServiceStatus.dwWin32ExitCode = NO_ERROR;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCheckPoint = 0;
if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE)
{
std::cout << SERVICE_NAME << ": ServiceMain: SetServiceStatus returned error" << std::endl;
goto EXIT;
}
/*
* Perform tasks neccesary to start the service here
*/
std::cout << SERVICE_NAME << ": ServiceMain: Performing Service Start Operations" << std::endl;
// Create stop event to wait on later.
g_ServiceStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (g_ServiceStopEvent == NULL)
{
std::cout << SERVICE_NAME << ": ServiceMain: CreateEvent(g_ServiceStopEvent) returned error" << std::endl;
g_ServiceStatus.dwControlsAccepted = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
g_ServiceStatus.dwWin32ExitCode = GetLastError();
g_ServiceStatus.dwCheckPoint = 1;
if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE) {
std::cout << SERVICE_NAME << ": ServiceMain: SetServiceStatus returned error" << std::endl;
}
goto EXIT;
}
ResetEvent(g_ServiceStopEvent);
// Tell the service controller we are started
g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
g_ServiceStatus.dwWin32ExitCode = NO_ERROR;
g_ServiceStatus.dwCheckPoint = 0;
if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE)
{
std::cout << SERVICE_NAME << ": ServiceMain: SetServiceStatus returned error" << std::endl;
goto EXIT;
}
// Start the thread that will perform the main task of the service
hThread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, NULL);
std::cout << SERVICE_NAME << ": ServiceMain: Waiting for Worker Thread to complete" << std::endl;
// Wait until our worker thread exits effectively signaling that the service needs to stop
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
std::cout << SERVICE_NAME << ": ServiceMain: Worker Thread Stop Event signaled" << std::endl;
/* // 真正的服务程序逻辑, 也可以使用上面的线程
while (g_ServiceStatus.dwCurrentState == SERVICE_RUNNING) {
// do something...
}*/
/*
* Perform any cleanup tasks
*/
std::cout << SERVICE_NAME << ": ServiceMain: Performing Cleanup Operations" << std::endl;
g_ServiceStatus.dwControlsAccepted = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
g_ServiceStatus.dwWin32ExitCode = NO_ERROR;
g_ServiceStatus.dwCheckPoint = 3;
if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE)
{
std::cout << SERVICE_NAME << ": ServiceMain: SetServiceStatus returned error" << std::endl;
goto EXIT;
}
EXIT:
if (g_ServiceStopEvent != NULL)
{
CloseHandle(g_ServiceStopEvent);
}
ServiceMain_Exit = 1;
return;
}
VOID WINAPI ServiceCtrlHandler(DWORD CtrlCode)
{
std::cout << SERVICE_NAME << ": ServiceCtrlHandler: Entry" << std::endl;
switch (CtrlCode)
{
case SERVICE_CONTROL_STOP:
std::cout << SERVICE_NAME << ": ServiceCtrlHandler: SERVICE_CONTROL_STOP Request" << std::endl;
if (g_ServiceStatus.dwCurrentState != SERVICE_RUNNING)
{
break;
}
/*
* Perform tasks necessary to stop the service here
*/
g_ServiceStatus.dwControlsAccepted = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
g_ServiceStatus.dwWin32ExitCode = NO_ERROR;
g_ServiceStatus.dwCheckPoint = 4;
if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE)
{
std::cout << SERVICE_NAME << ": ServiceCtrlHandler: SetServiceStatus returned error" << std::endl;
}
// This will signal the worker thread to start shutting down
SetEvent(g_ServiceStopEvent);
// 需要等待主线程关闭再退出,否则资源未释放
while (ServiceMain_Exit == 0)
{
Sleep(1);
}
ServiceMain_Exit = 0;
// 不需要设置 SERVICE_STOPPED, 在ServiceMain主线程退出已经设置为SERVICE_STOPPED
/*g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
if (SetServiceStatus(g_StatusHandle, &g_ServiceStatus) == FALSE)
{
std::cout << SERVICE_NAME << ": ServiceCtrlHandler: SetServiceStatus returned error" << std::endl;
}*/
break;
default:
break;
}
std::cout << SERVICE_NAME << ": ServiceCtrlHandler: Exit" << std::endl;
}
// 最后,实现服务工作线程函数,这个函数将执行服务的主要任务:
DWORD WINAPI ServiceWorkerThread(LPVOID lpParam)
{
std::cout << SERVICE_NAME << ": ServiceWorkerThread: Entry" << std::endl;
// Periodically check if the service has been requested to stop
while (WaitForSingleObject(g_ServiceStopEvent, 0) != WAIT_OBJECT_0)
{
/*
* Perform main se
没有合适的资源?快使用搜索试试~ 我知道了~
windows service C++ Demo
共4个文件
sln:1个
filters:1个
vcxproj:1个
需积分: 5 2 下载量 147 浏览量
2023-05-23
10:35:27
上传
评论
收藏 5KB RAR 举报
温馨提示
使用C++实现windows service 的demo,vs2019工程,通过编译测试可用 可在服务的线程中添加自己的处理流程 可通过命令行sc命令控制服务或者通过exe命令行参数进行插入删除服务
资源推荐
资源详情
资源评论
收起资源包目录
ServiceDemo.rar (4个子文件)
ServiceDemo
Service.cpp 11KB
ServiceDemo.vcxproj.filters 969B
ServiceDemo.sln 1KB
ServiceDemo.vcxproj 7KB
共 4 条
- 1
资源评论
charlie'sblog
- 粉丝: 3
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 海尔618算价表_七海5.20_16.00xlsx(1)(2).xlsx
- WebCrawler.scr
- 【计算机专业毕业设计】大学生就业信息管理系统设计源码.zip
- YOLO 数据集:8种路面缺陷病害检测【包含划分好的数据集、类别class文件、数据可视化脚本】
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于YOLOv8的FPS TPS AI自动锁定源码+使用步骤说明.zip
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于yolov8+streamlit的火灾检测部署源码+模型.zip
- 测试aaaaaaabbbbb
- VID20240521070643.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功