2014-05-22 1 views
0

C++ Windows - How to get process path from its PID과 비슷하지만 그 반대의 경우 : 주어진 경로에서 PID를 가져 오는 방법은 무엇입니까?C++ Windows - 프로세스 PID를 경로에서 가져 오는 방법

업데이트 도구를 작성하려고하는데 EXE가 사용 중인지보고 싶습니다. 그런 다음 사용중인 경우 프로세스가 종료 될 때까지 기다려야합니다. 따라서, 나는 그 파일에 속한 프로세스 PID를 얻고 싶다.

+2

모든 라이브 프로세스와 현재 가지고있는 경로 중 어느 것이 실행 중인지 확인하십시오 –

+0

EXE 파일을 한 번만 열어 독점적으로 열려고 시도 할 수 없습니까? 성공하면 성공할 수 있습니다. – Erik

답변

2

찾고있는 것을 신속하고 간단하게 수행 할 수 있습니다. QueryFullProcessImageName을 사용하여 빠른 점검을 수행 할 수 있습니다. 필요에 따라 다음과 같은 코드가 작동하지 못하도록 할 수

것들 :

  • 당신이 과정을 볼 수있는 권한이없는 경우이 정보를 볼 수 되지 않습니다.
  • 프로세스가 64 비트이고 응용 프로그램을 32 비트로 실행하면 프로세스 ID가 표시되지만 프로세스 핸들을 열 수는 없습니다.

예 :

if (IsProcessInUse(your_file)) 
    AfxMessageBox(_T("The process is still running")); 
else 
    AfxMessageBox(_T("The process has been closed")); 

위의 간접 질문에 대한 답 :

BOOL GetProcessName(LPTSTR szFilename, DWORD dwSize, DWORD dwProcID) 
{ 
    BOOLEAN retVal = FALSE; 
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcID); 
    DWORD dwPathSize = dwSize; 
    if (hProcess == 0) 
     return retVal; // You should check for error code, if you are concerned about this 
    retVal = QueryFullProcessImageName(hProcess, 0, szFilename, &dwPathSize); 

    CloseHandle(hProcess); 

    return retVal; 
} 

BOOL IsProcessInUse(LPCTSTR process_name) 
{ 
    DWORD* pProcs = NULL; 
    DWORD dwSize = 0; 
    DWORD dwRealSize = 0; 
    TCHAR szCompareName[MAX_PATH + 1]; 
    int nCount = 0; 
    int nResult = 0; 

    dwSize = 1024; 
    pProcs = new DWORD[dwSize]; 
    EnumProcesses(pProcs, dwSize*sizeof(DWORD), &dwRealSize); 
    dwSize = dwRealSize/sizeof(DWORD); 

    for (DWORD nCount = 0; nCount < dwSize; nCount++) 
    { 
     ZeroMemory(szCompareName, MAX_PATH + 1 * (sizeof(TCHAR))); 
     if (GetProcessName(szCompareName, MAX_PATH, pProcs[nCount])) 
     { 
      if (_tcscmp(process_name, szCompareName) == 0) 
      { 
       delete[] pProcs; 
       return true; 
      } 
     } 
    } 
    delete[] pProcs; 
    return FALSE; 
} 

당신은 다음을 테스트하기 위해 다음과 같은 간단한 것을 사용합니다. 당신의 문자 질문에 대답하려면 다음과 같이 당신은 IsProcessInUse을 변경합니다 :주의해야 할

DWORD GetNamedProcessID(LPCTSTR process_name) 
{ 
    DWORD* pProcs = NULL; 
    DWORD retVal = 0; 
    DWORD dwSize = 0; 
    DWORD dwRealSize = 0; 
    TCHAR szCompareName[MAX_PATH + 1]; 
    int nCount = 0; 
    int nResult = 0; 

    dwSize = 1024; 
    pProcs = new DWORD[dwSize]; 
    EnumProcesses(pProcs, dwSize*sizeof(DWORD), &dwRealSize); 
    dwSize = dwRealSize/sizeof(DWORD); 

    for (DWORD nCount = 0; nCount < dwSize; nCount++) 
    { 
     ZeroMemory(szCompareName, MAX_PATH + 1 * (sizeof(TCHAR))); 
     if (GetProcessName(szCompareName, MAX_PATH, pProcs[nCount])) 
     { 
      if (_tcscmp(process_name, szCompareName) == 0) 
      { 
       retVal = pProcs[nCount]; 
       delete[] pProcs; 
       return retVal; 
      } 
     } 
    } 
    delete[] pProcs; 
    return 0; 
} 

마지막으로 중요한 것은이 단지 파일의 단일 인스턴스 (또는 PID)을 반환 것이라는 사실이며,이하지 않습니다 프로세스에 의해 사용되는 모듈을 찾으십시오 (프로세스에서 사용중인 DLL은 식별되지 않지만 제공된 링크에서이를 사용하는 방법을 볼 수 있습니다)

관련 문제