Hi~ Summers!!

중복실행 방지 본문

개발/VC++

중복실행 방지

eNaNII 2006. 2. 16. 16:31

상호배제기법을이용하면됩니다.
Mutex라고하지요...MutualExclusion...

프로세스,스레드처럼커널객체이며프로세스한정적인핸들을가지는게동기화객체입니다.이동기화객체는크리티컬섹션보다느리지만복잡한동기화에용용이용이합니다.
동기화객체는신호상태와비신호상태중한가지상태를유지하는데
신호상태는스래드의실행을허가하는상태입니다.비신호상태는반대겠지요..따라서비신호상태일경우신호상태가될때까지블럭됩니다.

뮤택스는오직하나의스레드에의해서만소유될수있습니다.소유되어있으면비신호상태,그반대이면신호상태가됩니다.
이뮤택스를이용하여프로그램을중복실행여부를확인할수있겠지요..
프로그램은최소한하나이상의스레드를가집니다.따라서어떤프로그램이실행될때뮤택스를생성하여비신호상태를유지하게되면
또똑같은프로그램이실행될경우에실행을중지시키는루틴을넣어두면되겠지요..이때쓰는함수가

CreateMutex(LPSECURITY_ATTRIBUTElpMutexAttribute,BOOLbInitionOwner,LPCSTRlpName)입니다.
첫번째인수는보안속성을말하는데커널객체는프로세스한정적이기때문에타프로세스가보안상의권리가있지않는한프로세스에접근할수없습니다.여기서는보통NULL로지정합니다.두번째인수는
뮤텍스를생성함과동시에소유할것인가여부인데여기서는TRUE겠지요,마지막으로뮤텍스의이름을지정하는데이것은프로세스간에뮤텍스를공유할때에사용됩니다.이뮤텍스의이름만안다면다른프로세스가OpenMutex라는함수로핸들을얻어올수있습니다.물론보안속성이NULL일때가능하겠지요..
그리고생성한mutex를파괴할때에는ReleaseMutex(HANDLEhMutex)를사용하여비신호상태인뮤텍스를다시신호상태로복귀시킵니다.
자이제한번만들어볼까요..
아주간단합니다.

인스턴트를초기화하는루틴에서..[InitInstance()]

m_Mutex=CreateMutex(NULL,TRUE,"TEST");
if(GetLastError==ERROR_ALREADY_EXISTS)
{
returnFALSE;
}

그리고소멸자에서..
ReleaseMutex(m_Mutex);
하시면되겠지여..
그럼CreateMutex의세번째인자인스트링으로뮤텍스를구분하며
똑같은뮤텍스가실행되려할때블럭된뮤텍스에의해서똑같은프로세스가중복실행되는것을방지할수있습니다.

참조:WindowsAPI완전정복

#define DUAL_CHK_KEY _T("Not_Dual")

//===============================================================

//

// 윈도 중복 실행 검사 함수

//

// 중복 실행이면 TRUE, 중복 실행 아니면 FALSE 리턴

//

//===============================================================

BOOL CNotDualApp::IsDualApp()

{

HANDLE hMutex = NULL;

hMutex = CreateMutex(NULL, FALSE, DUAL_CHK_KEY);

if( ::GetLastError() != ERROR_ALREADY_EXISTS)

return FALSE;

CString strErr;

strErr = "프로그램이 이미 실행중입니다.";

AfxMessageBox(strErr);

CloseHandle(hMutex);

return TRUE;

}

BOOL CNotDualApp::InitInstance()

{

//-[중복 실행 검사................

if(IsDualApp() == TRUE)

return FALSE;

Comments