c++ 实现windows后台服务,服务停止时,使打开的监控程序也退出
时间: 2023-06-20 12:07:17 浏览: 288
C++把程序转成服务
在 Windows 上实现后台服务可以使用 Windows Service API,可以使用 C++ 编写。
对于服务停止时,使打开的监控程序也退出,可以在服务停止时向监控程序发送信号让其退出,可以通过进程间通信实现。具体实现步骤如下:
1. 在服务中获取监控程序的进程 ID。
2. 使用 Windows API 函数打开进程句柄并向进程发送退出信号。
3. 在监控程序中处理退出信号并退出程序。
示例代码如下:
```c++
#include <Windows.h>
#include <tchar.h>
// 定义监控程序的进程 ID
DWORD g_dwMonitorPid = 0;
// 获取监控程序的进程 ID
void GetMonitorProcessId()
{
// 根据进程名查找进程
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(pe32);
if (Process32First(hSnapshot, &pe32))
{
do
{
if (_tcsicmp(pe32.szExeFile, _T("monitor.exe")) == 0)
{
// 找到监控程序进程
g_dwMonitorPid = pe32.th32ProcessID;
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
}
}
// 发送退出信号给监控程序
void SendExitSignalToMonitor()
{
if (g_dwMonitorPid != 0)
{
// 打开进程句柄
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, g_dwMonitorPid);
if (hProcess != NULL)
{
// 向进程发送退出信号
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
}
}
// 服务停止时的回调函数
VOID WINAPI ServiceCtrlHandler(DWORD dwControl)
{
switch (dwControl)
{
case SERVICE_CONTROL_STOP:
// 发送退出信号给监控程序
SendExitSignalToMonitor();
// 停止服务
// ...
break;
}
}
// 服务入口函数
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
{
// 注册回调函数
SERVICE_STATUS_HANDLE hStatus = RegisterServiceCtrlHandler(_T("MyService"), ServiceCtrlHandler);
if (hStatus != NULL)
{
// 设置服务状态
SERVICE_STATUS status = { 0 };
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &status);
// 获取监控程序进程 ID
GetMonitorProcessId();
// 持续运行服务
while (status.dwCurrentState == SERVICE_RUNNING)
{
// ...
}
}
}
// 服务安装函数
void InstallService()
{
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (hSCManager != NULL)
{
// 创建服务
SC_HANDLE hService = CreateService(hSCManager,
_T("MyService"), _T("My Service"),
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
_T("C:\\MyService.exe"), NULL, NULL, NULL, NULL, NULL);
if (hService != NULL)
{
// 启动服务
StartService(hService, 0, NULL);
CloseServiceHandle(hService);
}
CloseServiceHandle(hSCManager);
}
}
int main()
{
// 安装服务
InstallService();
return 0;
}
```
阅读全文