4
C++에서 실행중인 프로세스의 파일 핸들을 얻으려고합니다. 이 코드는 잘 작동되지만프로세스의 파일 핸들을 얻는 방법은 무엇입니까?
#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
void killProcessByName(const char *filename)
{
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof (pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);
while (hRes)
{
if (strcmp(pEntry.szExeFile, filename) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
(DWORD) pEntry.th32ProcessID);
if (hProcess != NULL)
{
CloseHandle(hProcess);
}
}
hRes = Process32Next(hSnapShot, &pEntry);
}
CloseHandle(hSnapShot);
}
int main()
{
killProcessByName("WINWORD.EXE");
return 0;
}
필요한 핸들을 해제하기되지 않습니다 이 내 코드입니다. 비교 (strcmp
) 부분에 문제가 있습니까? 내가 잘못하고있는 다른 것이 있습니까?
"핸들이 해제되지 않음"이란 무엇을 의미합니까? 이 문맥에서 "해제 된"의미는 무엇입니까? 프로세스를 연 다음 핸들을 다시 닫습니다. 핸들을 놓아야합니다 - 무언가가 출시되지 않았다는 것을 어떤 수단으로 결정합니까? 아니면 OpenProcess가 그 프로세스에 대한 핸들을 제공하는 것보다 더 많은 것을하고 있다고 기대하고 있습니까? 'TerminateProcess (handle)'과 같은 효과가 있습니까? –
출시됨에 따라 * CloseHandle *을 참조하십시오. 이 핸들은 해제/닫히지 않습니다. 내 파일에는 여전히 활성 핸들이 있으며 삭제하거나 이름을 바꿀 수 없습니다. & 예 : Openprocess()가 terminateprocess()와 같은 것을 할 것이라고 기대하지 않습니다. 나는 그것이 나에게 손잡이를 돌려줘야 한 ㄴ다는 것을 알고있다. 하지만 문제는 strcmp의 프로그램 오류입니다. 왜 그래야만하지 ? – user2518829
"strcmp의 오류"는 정확히 무엇을 의미합니까? 그리고'CloseHandle'은'OpenProcess'로 방금 연 핸들을 닫습니다. 예를 들어, 현재 실행중인 .exe 파일의 이름을 바꾸는 것을 허용하지 않습니다. - OS는이 파일을 종료 할 때까지 열려 있습니다. 조작이 그것을 바꿀 것입니다. –