現在的很多程序都可以通過 Internet 進行版本更新,Windows 操作系統本身的“Windows Update”就是一個典型的例子。要實現這種特性,首先必須對應用程序的版本進行檢查。那麼如何通過 Internet 對自己的程序進行版本檢查呢?
但是,如果僅僅是為了檢查程序的版本,那麼可以將新的版本信息以文本形式保存在 Web 站點上,需要時通過 FTP 獲取文件信息。下載 文件的操作可以通過現成的 Windows Internet API 來實現,也就是大家都熟悉的 WinInet,如果你沒有用過它,沒關系,本文會詳細講述如何用它來編寫FTP程序。WinInet 的使用不難,他有固定的套路:第一步創建一個連接;第二步創建一個 FTP 會話;第三步打開文件;第四步讀取文件數據,就這麼簡單。用代碼表示就象下面這樣:
HINTERNET h = InternetOpen(...);
HINTERNET hftp = InternetConnect(..,INTERNET_SERVICE_FTP,..);
HINTERNET hftpfile = FtpOpenFile(...);
InternetReadFile(...);
下面就讓我們深入細節,享受精彩。為了方便代碼的重用,我寫了類 CWebVersion,這個類對所有細節進行了封裝,實現的功能很簡單:就是通過 Web 來獲取程序版本信息,實現版本的檢查。這個類的使用也很方便:
if (CWebVersion::Online()) {
CWebVersion ver("pub.chinafsdu.net");
if (ver.ReadVersion("version.txt"),"pub","pub") {
DWORD maj = ver.dwVersionMS;
DWORD min = ver.dwVersionLS;
}
}
下面是CWebVersion的聲明:
////////////////////////////////////////////////////////////////
// WebVersion.h
//
#pragma once
class CWebVersion {
protected:
enum { BUFSIZE = 64 };
LPCTSTR m_lpServer; // server name
DWORD m_dwError; // most recent error code
TCHAR m_errInfo[256]; // extended error info
TCHAR m_version[BUFSIZ]; // version number as text
void SaveErrorInfo(); // helper to save error info
public:
DWORD dwVersionMS; // version number: most-sig 32 bits
DWORD dwVersionLS; // version number: least-sig 32 bits
CWebVersion(LPCTSTR server) : m_lpServer(server) { }
~CWebVersion() { }
static BOOL Online();
BOOL ReadVersion(LPCTSTR lpFileName,LPCSTR lpszUserName,LPCSTR l