본문 바로가기

Computer Science/Languages

[MFC] 중복실행방지

728x90

 

 

 

 

 

//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;

} 

////