Windows C++ 进程辅助类 进程启动 结束 查找 看门狗 守护进程

注意:下面类中用到的std::string path路径,一律假设为编码ASCI路径,因为是调用Windows API。

头文件

#pragma once
#include <WinBase.h>
#include <string>
class ProcessHelper
{
public:
	static bool IsRunningAlready(const std::string& processName);
	static void StartProcessByName(const std::string& processName);
	static void StartProcessByFileFullPath(const std::string& exeFileFullPath);
	static DWORD FindProcessIDByName(const std::string& processName);//0 not found ; other found; processName "processName.exe"
};

源文件

#include "StdAfx.h"
#include "ProcessHelper.h"
#include <WinBase.h>
#include "tlhelp32.h"//Kernel32.dll Kernel32.lib
#include "PathHelper.h"
#include <ShellAPI.h>
#include "StringHelper.h"

bool ProcessHelper::IsRunningAlready(const std::string& processName)
{
	HANDLE tempMutex = CreateMutexA(NULL, TRUE, processName.c_str());
	DWORD dwRet = GetLastError();
	if (tempMutex)
	{
		if (ERROR_ALREADY_EXISTS == dwRet)
		{
			//MessageBoxA(nullptr, "程序已经在运行中了!", "警告", MB_OK);
			CloseHandle(tempMutex);
			return true;
		}
	}
	return false;
}
void ProcessHelper::StartProcessByName(const std::string& processName)
{
	if(FindProcessIDByName(processName)==0)
	{
		//wfout << "ready to start exe:"<<fullPathFile<<std::endl;
		SHELLEXECUTEINFOA lpExecInfo = {0};
		lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
		lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
		lpExecInfo.lpVerb = "Open"; 
		lpExecInfo.hwnd = NULL; 
		auto fullPathFile = PathHelper::GetCurrentDir() + processName;
		lpExecInfo.lpFile = (fullPathFile).c_str();
		lpExecInfo.lpDirectory = nullptr; 
		lpExecInfo.nShow = SW_SHOWDEFAULT; 
		lpExecInfo.lpParameters = NULL; 
		lpExecInfo.hInstApp = NULL; 
		auto ret = ShellExecuteExA(&lpExecInfo);
		if (!ret)
		{
			//wfout<<L"can not found file:" << fullPathFile << std::endl;
		}
	}
}
void ProcessHelper::StartProcessByFileFullPath(const std::string& exeFileFullPath)
{
	if(FindProcessIDByName(exeFileFullPath)==0)
	{
		//wfout << "ready to start exe:"<<fullPathFile<<std::endl;
		SHELLEXECUTEINFOA lpExecInfo = {0};
		lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
		lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
		lpExecInfo.lpVerb = "Open"; 
		lpExecInfo.hwnd = NULL; 
		auto fullPathFile = exeFileFullPath;
		lpExecInfo.lpFile = (fullPathFile).c_str();
		lpExecInfo.lpDirectory = nullptr; 
		lpExecInfo.nShow = SW_SHOWDEFAULT; 
		lpExecInfo.lpParameters = NULL; 
		lpExecInfo.hInstApp = NULL; 
		auto ret = ShellExecuteExA(&lpExecInfo);
		if (!ret)
		{
			//wfout<<L"can not found file:" << fullPathFile << std::endl;
		}
	}
}
DWORD ProcessHelper::FindProcessIDByName(const std::string& processName)//0 not found ; other found; processName "processName.exe"
{
	HANDLE hProcessSnap;
	PROCESSENTRY32 pe32;
	hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
	if( hProcessSnap == INVALID_HANDLE_VALUE )
	{
		return( 0 );
	}
	pe32.dwSize = sizeof( PROCESSENTRY32 );
	if( !Process32First( hProcessSnap, &pe32 ) )
	{
		CloseHandle( hProcessSnap );          // clean the snapshot object
		return( 0 );
	}
	DWORD processId = 0;
	do
	{
#ifdef _UNICODE
		if(std::wstring(pe32.szExeFile) == StringHelper::ANSIToUnicode(processName))//进程名称
#else
		if(std::string(pe32.szExeFile) == processName)//进程名称
#endif
		{
			processId = pe32.th32ProcessID;//进程ID
			break;
		}
	} while( Process32Next( hProcessSnap, &pe32 ) );
	CloseHandle( hProcessSnap );
	return( processId );
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Windows服务进程是一种在Windows操作系统下运行的后台程序,通常以服务的形式运行。而守护线程是服务进程中负责监控和处理特定任务的线程。 守护线程可以理解为服务进程中的"看门狗",它负责监视服务进程的运行状态并及时进行处理。它可以周期性地检查服务进程的状态,比如进程是否假死、内存是否泄露等。一旦发现异常情况,守护线程会及时采取相应措施来修复或重启服务进程,以确保服务的正常运行。 守护线程具有以下特点: 1. 自动修复:当服务进程出现异常时,守护线程可以根据预定的修复策略自动采取措施来修复问题。比如重新启动服务进程、释放内存或重置资源等。 2. 监控功能:守护线程通过检查服务进程的运行状态,包括内存使用情况、请求响应时间和CPU使用率等,来监控服务进程的健康状况。一旦发现异常情况,守护线程会及时发出警报并采取相应的处理措施。 3. 异常处理:守护线程可以捕获服务进程抛出的异常,并根据配置的策略进行处理。比如记录日志、发送通知或执行特定的修复任务。 4. 高可靠性:通过使用守护线程,可以提升服务进程的可靠性和稳定性。一旦服务进程出现异常或崩溃,守护线程能够迅速检测并采取措施,避免长时间的服务中断。 总的来说,守护线程在Windows服务进程中扮演着非常重要的角色,它能够确保服务的稳定运行,并及时监控和处理异常情况,提升了服务的可靠性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值