본문 바로가기

old drawer/C, C++, MFC

[C/C++] 프로세스명으로 프로세스 종료(함수)

처음 의도는 어떤 프로세스에 시그널을 보내어 자체 로직에 따라 종료하는 로직을 찾은것이다.
하지만 찾는도중 프로세스명으로 프로세스를 종료하는 로직이 있기에 올려본다.

출처는 불분명하여 누가 올렸는지는 알수없다.

프로그램에 내용에 대해서는 차후 설명하기로 하고 VC++에서 컴파일 될수있는 몇가지 옵션만 올려본다.

psapi.h는 visual studio 2003에서는 그냥 컴파일이 되며 6.0에서는 SDK를 설치해야만 한다.
projectsetting -> link -> Object/library modles에 Psapi.lib를 추가해주어야한다.
afx.h를 psapi.h보다 먼저 선언해주어야하며, 이후 컴파일이 순조롭게 진행된다면 문제가 없지만 다음과 같은 에러가 날수가 있다.
uafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
uafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

위의 두가지 에러가 발생하였다면
Project > setting > General > Microsoft Foundation Classes: 에서 Use MFC in a Static Libary
선택하면 문제없이 컴파일 될것이다.


#include <afx.h>
#include <psapi.h>

void ExixProcessName(CString strProcessName);

int main(int argc, char** argv)
{
     ExixProcessName("test.exe");
     return 0;
}

void ExixProcessName(CString strProcessName)
{
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ))
        return;

    cProcesses = cbNeeded / sizeof(DWORD);

    for ( i = 0; i < cProcesses; i++ )
    {
        char szProcessName[MAX_PATH] = "unknown";

        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
            FALSE, aProcesses[i] );

        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;

            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
            }
        }

        bool bRet;
        if(strcmp(szProcessName,(LPSTR)(LPCTSTR)strProcessName)==0)
        {
   HANDLE hProcess = NULL;

   hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, aProcesses[i]);
   if(hProcess != NULL)
   {       
    DWORD    ExitCode = 0;
    GetExitCodeProcess( hProcess, &ExitCode );
    bRet = ::TerminateProcess(hProcess, ExitCode );               
    if( bRet )
    {
     ::WaitForSingleObject(hProcess, INFINITE);
    }
 
    ::CloseHandle(hProcess);
   }
  }
  CloseHandle( hProcess );
    }
}