基于 Web 的程序版本检查
2006-07-21 11:09:14 来源:WEB开发网4,3,0,0
这是用逗号分隔的四个数字,格式与应用程序 VS_VERSION_INFO 资源中的 FILEVERSION 和 PRODUCTVERSION 版本号相同。ReadVersion 将这个数字读入两个32位的 DWORDs,dwVersionMS 和 dwVersionLS。Windows 使用64位的版本号,所以你可以发布 18,446,744,070,000,000,000 版本。在美国,这是 18 乘以一百万的三次方,而在欧洲这是 18 乘以一百万的五次方。如果每秒钟发布一个新版本,这些版本要八百万个程序员发布 75,000 年。这样的话,我们最好赶快练一下自己的打字速度。
图一是本文的控制台例子程序(cslVerChkApp.exe)运行画面,此程序使用 CWebVersion 通过 FTP 读取版本号。
图一 控制台例子程序运行画面
下面我们来看看 CWebVersion 的工作原理。其大多数函数都是自解释的;为了检查系统是否连接,CWebVersion::Online调用了一个WinInet 函数 InternetQueryOption 来获取 INTERNET_OPTION_CONNECTED_STATE。如果返回的状态具备INTERNET_STATE_CONNECTED标志,说明有一个活动的连接。为了访问 Internet 并读取版本文件,CWebVersion 还用到了另外一个定制的C++类:CInternetHandle: ////////////////////////////////////////////////////////////////
这个类主要是封装 HINTERNET。其作用是为了方便进行错误处理。如果某个WinInet 函数调用失败,调用 GetLastError 会获取失败原因么。但 CloseInternetHandle 会清除出错代码,所以,必须在 CloseInternetHandle 之前调用 GetLastError。看看下面的代码就会明白:
// InternetHandle.h
//
#pragma once
class CInternetHandle {
protected:
HINTERNET m_handle; // underlying handle
public:
CInternetHandle() : m_handle(NULL) { }
CInternetHandle(HINTERNET h) : m_handle(h) { }
~CInternetHandle() { Close(); }
// Close handle and set to NULL so I don''t close again.
void Close() {
if (m_handle) {
InternetCloseHandle(m_handle);
m_handle = NULL;
}
}
// Assignment from HINTERNET
CInternetHandle& operator= (HINTERNET h)
{
ASSERT(m_handle==NULL); // only initial assignment, not copy
m_handle = h;
return *this;
}
// cast to HINTERNET
operator HINTERNET() {
return m_handle;
}
}; ////////////////////////////////////////////////////////////////
// 如果没有 CInternetHandle 类。代码可能会是下面这个样子。
// 必须在几个地方调用 GetLastError ,否则CloseInternetHandle 会
// 清除出错代码.
//
DWORD err;
HINTERNET h = InternetOpen(...);
if (h!=NULL) {
HINTERNET hftp = InternetConnect(..,INTERNET_SERVICE_FTP,..);
if (hftp!=NULL) {
HINTERNET hftpfile = FtpOpenFile(...);
if (hftpfile!=NULL) {
InternetReadFile(...);
if (/* success */) {
// do something
} else {
err = GetLastError();
}
InternetCloseHandle(hftpfile);
} else {
err = GetLastError();
}
InternetCloseHandle(hftp);
} else {
err = GetLastError();
}
InternetCloseHandle(h);
} else {
err = GetLastError();
}
- ››基于IP地址的vsftp服务器
- ››基于MySQL 水平分区的优化示例
- ››web安全之信息刺探防范1
- ››基于CentOS5的Linux下pptp和openvpn的搭建及配置
- ››webqq 最新加密算法
- ››webdriver 数据库验证方法
- ››WebSphere Application Server 7.0 XML Feature P...
- ››Web2.0网络时代基于社会影响力的声望值
- ››Web服务器搭建:配置Linux+Apache+Mysql+PHP(或Pe...
- ››WebLogic调整Java虚拟机性能优化参数
- ››基于JavaScript的网页版塔防游戏
- ››基于Android平台 QQ大战360手机游戏爆红
更多精彩
赞助商链接