C++ Windows - How to get process path from its PID과 비슷하지만 그 반대의 경우 : 주어진 경로에서 PID를 가져 오는 방법은 무엇입니까?C++ Windows - 프로세스 PID를 경로에서 가져 오는 방법
업데이트 도구를 작성하려고하는데 EXE가 사용 중인지보고 싶습니다. 그런 다음 사용중인 경우 프로세스가 종료 될 때까지 기다려야합니다. 따라서, 나는 그 파일에 속한 프로세스 PID를 얻고 싶다.
C++ Windows - How to get process path from its PID과 비슷하지만 그 반대의 경우 : 주어진 경로에서 PID를 가져 오는 방법은 무엇입니까?C++ Windows - 프로세스 PID를 경로에서 가져 오는 방법
업데이트 도구를 작성하려고하는데 EXE가 사용 중인지보고 싶습니다. 그런 다음 사용중인 경우 프로세스가 종료 될 때까지 기다려야합니다. 따라서, 나는 그 파일에 속한 프로세스 PID를 얻고 싶다.
찾고있는 것을 신속하고 간단하게 수행 할 수 있습니다. QueryFullProcessImageName을 사용하여 빠른 점검을 수행 할 수 있습니다. 필요에 따라 다음과 같은 코드가 작동하지 못하도록 할 수
것들 :
예 :
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은 식별되지 않지만 제공된 링크에서이를 사용하는 방법을 볼 수 있습니다)
모든 라이브 프로세스와 현재 가지고있는 경로 중 어느 것이 실행 중인지 확인하십시오 –
EXE 파일을 한 번만 열어 독점적으로 열려고 시도 할 수 없습니까? 성공하면 성공할 수 있습니다. – Erik