프로그램 중복 실행 방지를 사용하다가 중복 실행이 필요한 경우가 생겨서 활용해보았다.
내 경우는 FTP Uploader 프로그램을 만들어서 FTP 서버에 필요한 파일을 다운하거나 업로드 하는데 사용하고 있었다.
두군데의 서버에 파일을 올려주고 있었는데 그중 하나의 서버가 느려져서 다른 서버의 업로드에도 영향을 주는 일이 발생하여 프로그램을 하나 더 실행 하도록 하였다.
FTP Uploader는 메인 프로그램에서 업로드 신호를 주는데 타이틀명으로 프로세스를 찾아서 메세지를 날려서 통신하는 프로세스통신을 이용하고 있었다.
요런 경우 단지 중복 실행만 하게되면 같은 타이틀명인 프로그램이 두개가 되기 때문에 따로 다른 파일 업로드 신호를 보내줄 수 없다.
그렇다고 프로그램을 따로 만들기는 귀찮고 버전관리도 힘드니 최소한의 수정으로 상황에 맞게 바꿔보았다.
뮤텍스를 이용하는 기본 방법은 동일하다.
App 함수 헤더에 BOOL 형 변수를 하나 추가해주자.
class CFTPUploaderApp : public CWinAppEx
{
public:
CFTPUploaderApp();
// Overrides
public:
virtual BOOL InitInstance();
HANDLE m_hMutex;
BOOL m_bExist;
// Implementation
DECLARE_MESSAGE_MAP()
};
cpp파일엔 다음과 같이 프로그램이 하나 실행되어 있다면 다른이름의 뮤텍스를 하나더 만든다.
BOOL CFTPUploaderApp::InitInstance()
{
m_bExist=FALSE;
m_hMutex = CreateMutex(NULL, FALSE, “FTPUploader”);
if (ERROR_ALREADY_EXISTS == GetLastError())
{
m_bExist=TRUE;
CloseHandle(m_hMutex);
m_hMutex = CreateMutex(NULL, FALSE, “FTPUploader_DRS”);
if (ERROR_ALREADY_EXISTS == GetLastError())
{
return FALSE;
}
}
}
이렇게 하면 프로그램의 두개 까지만 실행가능해진다.
그리고 나서 프로그램 초기화 부분에 (나는 다이얼로그기반이라서 OnInitDialog 에 추가) 다음과 같이 프로그램의 타이틀명을 바꿔준다.
BOOL CFTPUploaderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CFTPUploaderApp* pApp=(CFTPUploaderApp*)AfxGetApp();
if(pApp->m_bExist==TRUE)
this->SetWindowText(“FTPUploader_DRS”);
}
요렇게 하면 같은 프로그램이지만 타이틀명으로 따로 프로세스 통신이 가능하게 되어 두개의 프로그램에 서로 다른 메세지를 보낼수 있게 된다.