2013-07-29 3 views
1

특정 프로세스가 실행 중인지 확인해야하는 C++ DLL이 있습니다.C++ 특정 프로세스가 실행 중인지 확인하십시오.

DLL이 응용 프로그램을 시작됩니다

가 실행됩니다 DLL이 때 그것을 할 필요가 무엇

c:\Directory\SubDirectory\application2.exe 

: 그것은 또 다른 실행 파일을 가지고 그 안에 하위 디렉토리가

c:\Directory\application.exe 

application2.exe가 실행 중인지 확인하십시오. 가장 중요한 것은 해당 폴더 내에서 실행되고 있다는 것입니다. 실행중인 복사본이 여러 개 있기 때문에 올바른 폴더가 실행 중인지 확인해야합니다.

i를 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 

당신은 비슷한 뭔가를 C++에서 WMI API를 사용할 수 있습니다.

+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

또는'PathCanonicalize'와 함께'GetProcessImageFileName'을 사용하십시오. – bkausbk

관련 문제