예전에 MFC를 이용해서 점검 소프트웨어를 작성하고, 결과를 엑셀 파일로 출력하는 프로그램에서 외부 호출 프로그램인 엑셀을 종료하기 위해서 많은 방법을 사용해 봤는데 결과가 좋지 않았다. 그 중에서 그럭저럭 괜찮은 방법이 있어 기록해둔 자료를 옮겨놓는다. 

     

    테스트 다이얼로그 종료할 때 인터넷에서 확인한 방법으로 다음과 같이 소멸자를 호출하였다. 

    #include <Tlhelp32.h>
    
    // ... 생략 ...
    
    CescanSimDlg::~CescanSimDlg()
    {
        HANDLE hSnap = NULL;
        PROCESSENTRY32 ps32;
        ps32.dwSize = sizeof(PROCESSENTRY32);
        hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        CloseHandle(hSnap);
    }

     

    하지만 위의 내용으로 종료되지 않는 프로세스들이 있어 다음과 같이 종료 코드를 추가하였다. 아래의 소스코드는 시스템의 모든 프로세스를 확인해서 특정 문자열이 있는 프로세스번호를 찾아 직접 종료시킨다. 

     

    //=================================================================
    void CescanSimDlg::KillProcess()
    //=================================================================
    {
        DWORD dwSize = 250;
        HANDLE hSnapShot;
        PROCESSENTRY32 pEntry;
        BOOL bCrrent=FALSE;
    
        hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
        pEntry.dwSize =sizeof(pEntry);
        Process32First (hSnapShot,&pEntry);
        //
        while(1)
        {
            // 다음번 프로세스의 정보를 가져온다.
            BOOL hRes=Process32Next (hSnapShot,&pEntry);
    
            if(hRes==FALSE)
            break;       
            if(!strncmp(pEntry.szExeFile,"EXCEL.EXE",8))    // find EXCEL.EXE
            {
                bCrrent = TRUE;
            }
            if(bCrrent)
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pEntry.th32ProcessID);
                if(hProcess)
                {
                    if(TerminateProcess(hProcess, 0))
                    {
                        unsigned long nCode; //프로세스 종료 상태
                        GetExitCodeProcess(hProcess, &nCode);
                    }
                    CloseHandle(hProcess);
                }
                break;
            }
        }
    }

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기