자동 업데이트는 복잡하게 만든다면 한 없이 복잡하게 만들 수 있지만, 여기서는 가장 단순하게 새로운 버전이 있을 때 사용자에게 알려주고 다운로드 웹페이지를 열어주는 것 까지만 구현해 보겠다.
class UpdateUtil
{
public:
static bool GetLocalVersion(CAtlString& version);
static bool GetServerVersion(CAtlString& version, CAtlString& url);
static bool IsUpdatable(const CAtlString& localVersion, const CAtlString& serverVersion);
};
구현코드는 sdp 프로젝트를 내려받으면 있다.
http://dev.naver.com/projects/sdp
Easy 레지스트리 프로젝트에서 버전 체크함수가 있다.
bool CheckNewVersion(bool showbox, CAtlString& url, CAtlString& msg)
{
CAtlString local;
if( !UpdateUtil::GetLocalVersion(local))
{
if( showbox)
{
AfxMessageBox(__L("version.msg.localerror"), MB_SYSTEMMODAL | MB_OK);
}
return false;
}
CAtlString server;
if( !UpdateUtil::GetServerVersion(server, url))
{
if( showbox )
{
AfxMessageBox(__L("version.msg.servererror"), MB_SYSTEMMODAL | MB_OK);
}
return false;
}
msg = __L("version.local");
msg += local;
msg += L"\n";
msg += __L("version.recent");
msg += server;
msg += L"\n\n";
if( ! UpdateUtil::IsUpdatable(local, server) )
{
if( showbox )
{
AfxMessageBox(msg + __L("version.msg.recent"), MB_SYSTEMMODAL | MB_OK);
}
return false;
}
return true;
}
최종적으로
void CToolbarDlg::_CheckVersion( bool showbox )
{
CAtlString url, msg;
if( CheckNewVersion(showbox, url, msg) )
{
int id = AfxMessageBox(msg + __L("version.msg.homepage") + L"\n\n" + url, MB_SYSTEMMODAL | MB_YESNO);
if(id == IDYES)
{
ShellExecute(m_hWnd, L"open", url, NULL, NULL, SW_SHOWNORMAL);
}
}
}
version.xml의 내용
</root>
업데이트를 새로운 셋업 파일을 자동으로 내려받아서 실행해 주는 방식으로 구현할 경우, 실행화일의 유효성을 검사할 필요가 있다. 설치된 폴더로 개별 파일을 내려받아서 복사하는 방식도 생각해 볼 수 있으나 구현이 복잡하고 예외처리 할 것이 많아서 추천하지는 않는다.
__L 매크로는 다국어 지원용 매크로인데 src/base/StringBundle.h 를 참고하면 된다.