Programing/C/C++2009. 11. 24. 19:56
자신이 제작한 라이브러리나 DLL이 아닌 다른 라이브러리나 DLL에서 동작하는 스레드를 강제적으로 종료시키고 싶을때 사용하면 됩니다

자기 자신의 프로세스가 아닌 다른 프로세스도 가능합니다만

그러기 위해서는 원하는 프로세스의 ID를 알아내야 합니다

코드가 저거보다는 좀 더 길어지겠죠^^

#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;
          }
     }
}

TerminateThread는 안좋지만.. 스레드 내부에 종료 루틴이 없는 이상 별 수 없군요
Posted by ratiel