예전에 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;
}
}
}
반응형
최근댓글