[MFC] 중복실행방지
//OnInitDialog 에서 처음실행할때 확인
HANDLE hEvent;
hEvent = CreateEvent(NULL, FALSE, TRUE, AfxGetAppName()); //어플이름으로 확인
if ( GetLastError() == ERROR_ALREADY_EXISTS) {
AfxMessageBox(_T("Already running.."));
exit(0) ;
}
//실행중인 어플 내부에서 프로그램 띄위기
SHELLEXECUTEINFO sei;
::ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = _T("실행할 프로그램 주소~~~(e.g c:\test.exe");
sei.lpParameters = _T("");
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = _T("open");
DWORD result = :: ShellExecuteEx(&sei);
if(sei.hProcess != NULL)
{
::WaitForSingleObject(sei.hProcess, INFINITE);
}
/// 뮤택스를 이용한 중복실행방지
if(NULL == ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T(STRING_MUTEX_NAME)))
{
// 중복실행이 아니므로 뮤택스 생성
m_hMutex = ::CreateMutex(NULL, FALSE, _T(STRING_MUTEX_NAME));
if(m_hMutex == NULL)
{
AfxMessageBox(_T("프로그램 실행에 실패하였습니다."), MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
}
else
{
// 중복실행일 경우 기존 열려있는 창을 맨 앞으로 보여줌
// 만약, 창이 최소화 상태라면 최소화 상태 해제
CWnd* pWnd = NULL;
pWnd = CWnd::FindWindow(NULL, _T(STRING_CAPTION_NAME));
if(pWnd != NULL)
{
if(pWnd->IsIconic())
pWnd->ShowWindow(SW_RESTORE);
else
pWnd->SetForegroundWindow();
}
else
{
pWnd = CWnd::FindWindow(NULL, _T(STRING_CAPTION_NAME));
if(pWnd != NULL)
{
if(pWnd->IsIconic())
pWnd->ShowWindow(SW_RESTORE);
else
pWnd->SetForegroundWindow();
}
}
return FALSE;
}
////