C++;检查特定进程是否正在运行 我有一个C++ DLL,我正在写,需要检查一个特定的进程是否在运行。
dll将启动,应用程序将在以下位置运行:C++;检查特定进程是否正在运行 我有一个C++ DLL,我正在写,需要检查一个特定的进程是否在运行。,c++,C++,dll将启动,应用程序将在以下位置运行: c:\Directory\application.exe 其中有一个子目录,其中包含另一个可执行文件: c:\Directory\SubDirectory\application2.exe 如果检查application2.exe是否正在运行,DLL在运行时需要做什么,最重要的是它正在该文件夹中运行——将有多个副本正在运行,因此我们需要确保运行的是正确的副本 我有以下代码可以很好地检测application2.exe是否正在运行,但它没有考虑文件路径
c:\Directory\application.exe
其中有一个子目录,其中包含另一个可执行文件:
c:\Directory\SubDirectory\application2.exe
如果检查application2.exe是否正在运行,DLL在运行时需要做什么,最重要的是它正在该文件夹中运行——将有多个副本正在运行,因此我们需要确保运行的是正确的副本
我有以下代码可以很好地检测application2.exe是否正在运行,但它没有考虑文件路径:
HANDLE pss = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
PROCESSENTRY32 pe = { 0 };
pe.dwSize = sizeof(pe);
if (Process32First(pss, &pe))
{
do
{
if(wcscmp(pe.szExeFile, L"application2.exe") == 0)
{
CloseHandle(pss);
return (1);
}
}
while(Process32Next(pss, &pe));
}
CloseHandle(pss);
如何检查进程的路径是否与调用DLL的应用程序的路径匹配?为此使用WMI
在命令行中,您可以执行以下操作:
wmic process where "executablepath = 'c:\path\to\executable.exe'" get ProcessId
您可以使用来自C++的WMI API来做类似的事情。
HANDLE ProcessSnap;
PROCESSENTRY32 Pe32;
unsigned int LoopCounter = 0;
Pe32.dwSize = sizeof(PROCESSENTRY32);
ProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(ProcessSnap, &Pe32);
wchar_t TermPath[MAX_PATH];
GetModuleFileName(NULL, TermPath, MAX_PATH);
wstring WTermPath(TermPath);
int index = WTermPath.find(L"\\application.exe");
wstring Path = WTermPath.substr(0, (index));
Path = Path + L"\\SubDirectory\\Application2.exe";
do
{
HANDLE Process;
wchar_t FilePath[MAX_PATH];
Process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, Pe32.th32ProcessID);
if (Process)
{
GetModuleFileNameEx(Process, 0, FilePath, MAX_PATH);
wstring WFilePath(FilePath);
if(WFilePath == Path)
{
CloseHandle(ProcessSnap);
return (1);
}
CloseHandle(Process);
}
LoopCounter++;
} while (Process32Next(ProcessSnap, &Pe32));
CloseHandle(ProcessSnap);
确实考虑过使用WMI,但对于这个小功能来说似乎有点过分了WMI很强大,但速度很慢。有(通常)更快的解决方案,例如使用“CreateToolhelp32Snapshot”处理像这样的集中任务。“使用该文件夹运行”是一个非常模糊的条件。有当前工作目录的概念,你的意思是吗?请注意,这会检查
Application2.exe
是否为子目录\Application2.exe
。此外,它应该使用QueryFullProcessImageName
,这比GetModuleFileNameEx
(进程的模块列表可以更改,EXE不能更改)更可靠,或者将GetProcessImageFileName
与pathcononicalize
结合使用。