2개의 프로젝트를 만들어 소프트웨어 업데이트 하기

 

1. 단일문서 기반의 첫번째 프로젝트(Update) 생성

Update.h파일에 이벤트 선언

class CUpdateApp : public CWinApp
{
public:
     CUpdateApp()

     CEvent m_ExitEvent;
     CEvent m_UpdateEvent;

 

Update.cpp파일에 생성 코드 추가

CUpdateApp::CUpdateApp()
:m_ExitEvent(FALSE, TRUE), m_UpdateEvent(FALSE, TRUE, TEXT("UPDATE_SW_EVENT"))
{

     // TODO: 여기에 생성 코드를 추가합니다.
     // InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}

 

2. UpdateApp클래스에 함수 추가

UINT CUpdateApp::ThreadUpdate(LPVOID pParam)
{
     return 0;
}

 

 

//소프트웨어 업데이트를 위한 코드 작성: 소프트웨어 업데이트에서 거의 정형화된 코드이므로 숙지. 외워도 좋음

UINT CUpdateApp::ThreadUpdate(LPVOID pParam)
{
     HANDLE arhList[2];
     arhList[0]=(HANDLE)theApp.m_ExitEvent;
     arhList[1]=(HANDLE)theApp.m_UpdateEvent;

 

     DWORD dwResult=::WaitForMultipleObjects(2, arhList, FALSE, INFINITE);
     if (dwResult==WAIT_OBJECT_0+1)
     {
      CWnd* pMain=theApp.m_pMainWnd;
          if (pMain != NULL) // NULL이면 윈도우가 없고, !=NULL 윈도우가 있다는 것
               pMain->PostMessage(WM_CLOSE);
     }
 return 0;
}

3. Update.cpp에 스레드가 시작할 수 있게 해줌

AfxBeginThread(CUpdateApp::ThreadUpdate,NULL); // InitInstance()함수가 시작되면서 스레드가 돌기 시작함

 

4. UpdapteApp클래스에서 ExitInstance()함수 재정의

int CUpdateApp::ExitInstance()
{
     m_ExitEvent.SetEvent();
     ::Sleep(100);

 

     return CWinApp::ExitInstance();
}

 

 


 

 

5. 대화상자 기반의 두번째 프로젝트(SetUpdate) 생성

 

6. 버튼추가, 캡션 수정(Button1 -> Set UpdateEvent)

 

7. 버튼을 더블클릭하여 이벤트 처리기 생성

void CSetUpdateDlg::OnBnClickedButton1()
{
     CEvent SetUpdateEvent(FALSE, TRUE, _T("UPDATE_SW_EVENT")); // 같은 이벤트 이름으로 설정(UPDATE_SW_EVENT)
     SetUpdateEvent.SetEvent();
     ::Sleep(500);
}

 

 

cf.) 두 프로젝트 모두 <afxmt.h> 인클루드 해주어야 함.

 

<실제 소프트웨어 업데이트에서 이용>

예를 들어 익스플로러를 업데이트 할때 이미 실행되어 있는 이전 버전의 익스플로러 여러개를

업데이트 전에 한번에 다 닫아준 후 업데이트를 시작한다.

이 코드를 실행 후 업데이트를 위한 ShellExecute가 실행된다.

 

프로그램의 중복실행 방지


Posted by 마마필로 :