2013-07-29 172 views
1

我有一个正在编写的C++ DLL,需要检查特定进程是否正在运行。C++检查特定进程是否正在运行

DLL将被启动的应用程序会在运行:

c:\Directory\application.exe 

有内一个子目录中有其他可执行:

c:\Directory\SubDirectory\application2.exe 

什么DLL需要做的,当它运行时检查application2.exe是否正在运行,最重要的是它在该文件夹中运行 - 将会运行多个副本,因此我们需要确保正确的运行。

我有下面的代码,在检测到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的应用程序的路径?

+0

“运行withing该文件夹”是一个非常模糊的状态。有一个当前工作目录的概念,你的意思是? – MSalters

回答

0

为此使用WMI。

在命令行中,你可以这样做:

wmic process where "executablepath = 'c:\path\to\executable.exe'" get ProcessId 

您可以使用WMI的API从C++做类似的事情。

+0

没有考虑过使用WMI,但对于这个小功能似乎有点矫枉过正 – Peter

+0

WMI功能强大,但速度很慢。有(通常)更快的解决方案,例如使用“CreateToolhelp32Snapshot”执行此类集中式任务。 – AlainD

0

我一直在考虑,为了这个工作,如果任何人在这里寻找一个解决方案是:

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); 
+1

请注意这会检查'Application2.exe'是否是'SubDirectory \ Application2.exe'。此外,它应该使用'QueryFullProcessImageName',它比'GetModuleFileNameEx'更可靠(一个进程的模块列表可以改变,EXE不能) – MSalters

+0

或者将'GetProcessImageFileName'和'PathCanonicalize'结合使用。 – bkausbk

相关问题