웹페이지를 통한 업데이트 시스템을 구축하도록 하고, 간단하게 업데이트 정도를 체크하고, 업데이트 여부를 물어보는
정도로 구현하겠습니다.
먼저 간단하게 다이얼로그 기반으로 프로젝트를 만듭니다.
새폴더로 "UpdateChecker"라는 폴더를 만듭니다.
업데이트를 체크하거나, 처리하는 기능은 이제 이 폴더에서 작업하기로 합니다.
현재 필요한 기능은 다음과 같습니다.
1. 내 프로그램의 파일버전 정보를 알아야 한다
2. 인터넷에 연결하고, 웹페이지를 다운받는다.
3. 웹페이지에서 버전 정보를 가져올수 있어야 한다.
4. 내 파일버전과, 웹페이지상의 버전 정보를 비교하여 다운로드 여부를 처리한다.
위의 기능들이 필요함으로, 새로 작성할까 하다가 인터넷을 검색해서 사용하기로 했습니다.
독일의 Alexander Bischofberger라는 분이 간단하게 작성해둔 루틴이 있어서 그것을 사용하기로 했습니다.
대략 그분의 기고글을 보면
-소개-
거의 모든 프로그램은 인터넷 업데이트를 사용한다. 유저도 편하고 개발자도 편하고 좋다
- 프로그램 버전 -
리소스 파일안에 FILEVERSION 이라는 항목을 사용한다
새 버전을 릴리지할경우 여기를 수정해 줘야 한다
- 클래스는 무엇을 하는가? =
CUpdateCheck()가 메인 함수이다. 업데이트 여부를 확인하고 웹에서 다운로드 한다.
이 클래스는 2개의 보조함수를 가지고 있다.
GetFileVersion() 은 어플리케이션의 파일버전을 가져온다.
GotoURL() 은 단순히 웹페이지를 열어준다.
- 자동업데이트를 하게하는 코드 -
1. 아래 코드를 CWinApp를 상속받은 어플리케이션 부분에 추가한다
void CMyApp::OnAppCheckupdate()
{
CUpdateCheck checkUpdate;
checkUpdate.Check(IDS_UPDATE);
}
여기서 IDS_UPDATE는 자신의 웹페이지 경로를 넣으면 된다(스트링 테이블에 삽입)
ex) http://lyoung.pe.kr/update/version.html
저자는 CWinApp에서 상속받은 클래스에 넣으라고 했지만, 본인은 해당버턴에 핸들러 함수에 넣도록 하겠다
2. 스트링 테이블에 아래 문자열을 추가한다
IDS_UPDATE_AVAILABLE |
You currently use version %u.%u of this program. The newest version %u.%u is available online. Do you want to see more information? |
IDS_UPDATE_NO |
No Updates available. |
IDS_UPDATE_NOCHECK |
Unable to check for updates |
3. 자신의 웹호스팅또는 서버에 파일을 올려 놓는다
Major Version|Minor Version|URL
ex) 현재 1,1,0,0 이고 웹에서 최신버전은 3,4,0,0 인 경우
http://lyoung.pe.kr/update/version.html 의 내용은
3|3|http://lyoung.pe.kr/update/version.html
- 주의사항 -
웹사이트의 파일은 512문자를 넘으면 안된다.
버전은 2개의 파트만 사용된다. (매이저, 마이너 버전)
자동 다운로드는 제공되지 않고, 단지 사이트를 다운로드하고 비교할 뿐이다.
///////////////////////////////////////////////////////////////////////////////
[원문]
Introduction
Almost all programs that are available today have a feature that checks for software updates using the internet. This is a convenient way for both the user and the developer: You don't have to contact all the users (if you know them...) when a new version is available. And the user can be sure to always have the newest version.
In this article I'd like to focus on small programs (e.g. only 1 executable and no nescessary installation program) and developers who have just a simple web space without the possibility to use scripts (only static web pages). Also this code only shows a web page and does not automatically download or install files.
The basic thing we have to do is very simple: Connect to a web site, ask for the newest version, compare it to the current version, and in case there is an update ask the user to download it. You - as the developer - have to use correct version information in your code and update the internet file whenever an update is available.
Program version
Ever looked at the version block of your code in the resource file? This resource consists of two major blocks: A language-independent information on the top containing file version etc. and some blocks where text information can be stored like the copyright. This code only uses the fixed block (FILEVERSION
) at the top of this resource. Please be sure to update this block any time you want to release a new version!
What this class does
The new class CUpdateCheck
has 1 main function: download a web site and check for updates! If you don't want to change any behaviour you simply use the class "as is" - that's all (besides adding the language-dependant strings). The class has two helper function GetFileVersion()
to get the applications File version and GotoURL()
which simply opens a web page in the default browser. I got the code for GotoURL()
somewhere on the web, so when you are the author please inform me to put your names to the credits.
Using the code, allow auto-updates
[1]: Add a new menu item to your application and handle it in your CWinApp
drived class. This could look like this: <PRE>void CMyApp::OnAppCheckupdate(){ CUpdateCheck checkUpdate; checkUpdate.Check(IDS_UPDATE);}</PRE>where the string IDS_UPDATE
is e.g. http://www.mywebsite.xxx/update.txt
In case you want to check automatically for updates each time the user start your application put the lines above in the InitInstance
function. Or write the last date you checked for updates to the registry and only check once each week. ....
[2]: Add a few strings to the string table:
IDS_UPDATE_AVAILABLE |
You currently use version %u.%u of this program. The newest version %u.%u is available online. Do you want to see more information? |
IDS_UPDATE_NO |
No Updates available. |
IDS_UPDATE_NOCHECK |
Unable to check for updates. |
[3]: Put a file on your webspace (located as referred in IDS_UPDATE
) which has the following syntax: <PRE>Major Version|Minor Version|URL for Update page</PRE>So when your program has currently the version 1,1,0,0
and you want to offer an update to 3,4,0,0
which is available for download at http://www.mydomain.com/updateinfo.html
the file should be <PRE>3|4|http://www.mydomain.com/updateinfo.html</PRE>
Limitations
- The file on your web site has to be less than 512 characters
- Only the two leftmost parts of the version info are used. The lower two numbers are normally used as a "Build number" and have no effect on this class
- No automatic download is offered, the user has to download the files from your site and copy/install them
History
01.11.2003: Initial release
<FORM id=aspnetForm style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" name=aspnetForm action=updatecheck.aspx method=post>
License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
About the Author
Alexander Bischofberger |
Ok, a few words about me: I started programming on the C64 by the "trial and error" method. Years later my parents got their first PC (Atari PC4, AT 8 MHz) where I started with Turbo Pascal. The next steps led to Turbo Pascal for Windows, Visual C++ 1.52c, and finally Visual C++ 6. I had several chances to code larger projects, e.g. * stand-alone disc copy station software (Win 3.1) with automatic reboot, disc encryption, ... * government-used strategic decision system * MLM marketing tool (www.upline.de) * maintenance for show planning system and other TV software (www.hse24.de) A lot of code, tipps and help came from this site for my later projects. Thanks again to all who helped me, even if they don't know it. I'm trying to share code (which is worth sharing) so others can get the help I got (and still need) for everyday problems. Well, I think that's enough.
|
그럼 MFC코드와 결합해 보기로 합니다.
UpdateCheck폴더에 #2에서 올려놓은 파일을 넣어줍니다.
버튼에 핸들러 함수를 연결합니다.
void CUpdaterDlg::OnBnClickedButton1()
{
CUpdateCheck checkUpdate;
checkUpdate.Check(IDS_UPDATE);
}
당연히 해더파일도 링크해야 합니다.
#include "UpdateCheck.h"
자 그럼 문자열 테이블에 필요한 문자열을 삽입하기로 하겠습니다.
이제 컴파일을 해서 실행해보기로 합니다.
에러가 나죠?
UpdateChecker.h/cpp에서 사용하는 함수중 일부는 winine.lib를 사용하고, 일부는 version.lib을 사용합니다.
참조 에러가 발생하게 됩니다.
UpdateChecker.cpp에
#include "wininet.h"를 추가합니다.
프로젝트 설정에서
링커->명령줄에 wininet.lib version.lib 를 추가해줍니다.
다시 컴파일을 하고 실행하여, 업데이트 체크 버턴을 눌러봅니다.
아래와 같은 화면을 볼수 있습니다
자 그럼 실제로 웹페이지를 만들어서 올려보겟습니다.
다시 실행해봅니다.
버전이 3.1이고, 업데이트 정보를 보겠냐는 내용이 출력됩니다.
정보 보기를 누를 경우는 이전에 제작한 주소로 연결해 줍니다.
'C & C++ > C & C++' 카테고리의 다른 글
메시지맵(Message Map) 을 사용하지 않고 메시지 처리하는 방법 (0) | 2011.04.28 |
---|---|
인터넷 바로가기 만들기 (0) | 2011.04.27 |
CString 변수값 숫자여부 판별 (0) | 2011.04.27 |
CFileDialog(파일 선택,저장,파일명,경로 읽기) (0) | 2011.04.26 |
[Tip] ESC 로 종료 안되게 (0) | 2011.04.25 |
댓글