#include<TlHelp32.h> //! l가 I(아이)인지 l(엘)인지 헷갈림.. ToolHelp32Lib를 사용하므로 l(엘)으로 적어둠
//! 여기서는 종료시킬 스레드의 id를 모른다는 가정하에 코드를 작성합니다
//! 알고 있다면 그냥 OpenThread로 스레드 핸들을 얻어와서 종료시키면 되겠죠 ^^
//! 반드시 종료시킬 스레드를 제외한 모든 스레드의 id를 알고 있어야 합니다(메인 스레드 포함)
//! 여기서는 종료시키지 않을 스레드ID를 임의적으로 threadID_1, threadID_2로 지칭합니다
.....(중략)
DWORD id = GetCurrentProcessId(); //! 자기 자신의 프로세스 id를 얻어온다
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
CreateToolhelp32SnapShot() 함수를 사용하실 때 한가지 주의점은, 종료시키고 싶은 스레드가 동작 후에 호출해야 제대로 종료시키고 싶은 스레드의 ID가 나옵니다.
스레드 동작 이전에 호출해 버리면 아무리 뒤져도 종료하고픈 스레드 ID는 나오지 않습니다
이거때문에 한참을 삽질했네요;;
이 부분때문에 다른 프로세스의 스레드중 원하는 어떤 임의의 스레드를 강제 종료시키는건 어려울 것 같습니다.
그 스레드가 언제 동작할지 모르니까요 :D
THREADENTRY32 th32;
th32.dwSize = sizeof(th32); //! 이 부분을 빼먹으면 스레드 정보가 저장되지 않음
Thread32First(hSnapShot, &th32); //! 첫번째 스레드 정보 불러옴
while(1)
{
Sleep(1);
if (!Thread32Next(hSnapShot, &th32)) //! 전체 프로세스의 마지막 스레드까지 도달했을경우
{
Thread32First(hSnapShot, &th32); //! 전체 프로세스의 첫번째 스레드의 값을 넣는다
}
if (th32.th32OwnerProcessID == id) //! th32의 프로세스ID와 자신의 프로세스ID가 동일하다면
{
if (th32.th32ThreadID != threadID_1 && th32.th32ThreadID != threadID_2)
{
//! OpenThread로 스레드의 핸들을 얻어온다
HANDLE hExitThread = OpenThread(THREAD_ALL_ACCESS, false, th32.th32ThreadID);
TerminateThread(hExitThread, NULL); //! 스레드 종료
CloseHandle(hExitThread);
break;
}
}
}