2013-07-30 3 views
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) 부분에 문제가 있습니까? 내가 잘못하고있는 다른 것이 있습니까?

+0

"핸들이 해제되지 않음"이란 무엇을 의미합니까? 이 문맥에서 "해제 된"의미는 무엇입니까? 프로세스를 연 다음 핸들을 다시 닫습니다. 핸들을 놓아야합니다 - 무언가가 출시되지 않았다는 것을 어떤 수단으로 결정합니까? 아니면 OpenProcess가 그 프로세스에 대한 핸들을 제공하는 것보다 더 많은 것을하고 있다고 기대하고 있습니까? 'TerminateProcess (handle)'과 같은 효과가 있습니까? –

+0

출시됨에 따라 * CloseHandle *을 참조하십시오. 이 핸들은 해제/닫히지 않습니다. 내 파일에는 여전히 활성 핸들이 있으며 삭제하거나 이름을 바꿀 수 없습니다. & 예 : Openprocess()가 terminateprocess()와 같은 것을 할 것이라고 기대하지 않습니다. 나는 그것이 나에게 손잡이를 돌려줘야 한 ㄴ다는 것을 알고있다. 하지만 문제는 strcmp의 프로그램 오류입니다. 왜 그래야만하지 ? – user2518829

+0

"strcmp의 오류"는 정확히 무엇을 의미합니까? 그리고'CloseHandle'은'OpenProcess'로 방금 연 핸들을 닫습니다. 예를 들어, 현재 실행중인 .exe 파일의 이름을 바꾸는 것을 허용하지 않습니다. - OS는이 파일을 종료 할 때까지 열려 있습니다. 조작이 그것을 바꿀 것입니다. –

답변

1

여기서 CloseHandle의 사용은 완벽하게 정확합니다. 실제로 실제로 무엇이 잘못되었는지에 대한 가정입니다. 이 파일은 OpenProcess에 의해 방금 연 핸들을 닫고 실행 파일을 변경 (삭제 또는 이름 바꾸기)하는 데 도움이되지 않습니다. 이는 해당 파일이 OS 내부에서 열려 있기 때문입니다. 운영체제는 실행 파일 (및 DLL)이 "요구로드"이기 때문에 파일을 열어두기 때문에 OS가 전체 실행 파일을 한 번에로드하지 않고 당분간 실제로 필요한 것만로드합니다. 나중에 실행되지 않은 코드가 필요할 때 해당 비트를로드합니다.