基于Web的程序版本检查

现在的很多程序都可以通过 Internet 进行版本更新,Windows 操作系统本身的“Windows Update”就是一个典型的例子。要实现这种特性,首先必须对应用程序的版本进行检查。那么如何通过 Internet 对自己的程序进行版本检查呢?本文将通过实际的例子程序来示范实现细节。

在进入正题之前,我想先罗嗦几句,说说与此文内容有关的个人好恶:我很讨厌程序显示那些必须让用户干预的消息框,这种消息框很烦人,尤其是问你要不要更新的那种对话框。碰到这种情况我总是回答“No”,然后选择“不要再来烦我”复选框(希望有一个这样的选择框)。 告诉用户进行程序版本更新本身并没有错,但是必须用一种适当的友好的方式通知用户,不要非得让用户来干预,除非是更新版本本身的行为。

但愿我的个人好恶没把你吓跑。其实,实现基于Web的版本检查有很多方法,2003年2月的 MSDN 杂志上有一篇标题为“使用.NET和后台智能传输服务API编写自动更新应用”的文章,此文的作者是 Jason Clark。文章描述了一种全新的专用协议 BITS 来解决自动更新问题。有兴趣的话可以仔细读一读。

但是,如果仅仅是为了检查程序的版本,那么可以将新的版本信息以文本形式保存在 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 lpszPassword);
  LPCTSTR GetVersionText()    { return m_version; }
  DWORD  GetError()       { return m_dwError; }
  LPCTSTR GetExtendedErrorInfo() { return m_errInfo; }
};
CWebVersion 的实现文件
////////////////////////////////////////////////////////////////
// WebVersion.cpp
//
#include "stdafx.h"
#include "WebVersion.h"
#include "InetHandle.h"
//////////////////
// Check if connected to Internet.
//
BOOL CWebVersion::Online()
{
  DWORD dwState = 0;
  DWORD dwSize = sizeof(DWORD);
  return InternetQueryOption(NULL,
    INTERNET_OPTION_CONNECTED_STATE, &dwState, &dwSize)
    && (dwState & INTERNET_STATE_CONNECTED);
}
//////////////////
// Read version number as string into buffer
//
BOOL CWebVersion::ReadVersion(LPCTSTR lpFileName,LPCSTR lpszUserName,LPCSTR lpszPassword)
{
  CInternetHandle hInternet;
  CInternetHandle hFtpSession;
  CInternetHandle hFtpFile;
  m_version[0] = 0;
  m_dwError=0;             // assume success
  m_errInfo[0]=0;           // ..
  DWORD nRead=0;
  hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL,
              NULL, 0);
  if (hInternet!=NULL) {
   hFtpSession = InternetConnect(hInternet, m_lpServer,
     INTERNET_DEFAULT_FTP_PORT, lpszUserName, lpszPassword, INTERNET_SERVICE_FTP,
     0, NULL);
   if (hFtpSession!=NULL) {
     hFtpFile = FtpOpenFile(hFtpSession, lpFileName,
      GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, NULL);
     if (hFtpFile!=NULL) {
      InternetReadFile(hFtpFile, m_version, BUFSIZE, &nRead);
      if (nRead>0) {
        m_version[nRead] = 0;
        int Mhi,Mlo,mhi,mlo;
        _stscanf(m_version, "%x,%x,%x,%x", &Mhi, &Mlo, &mhi, &mlo);
        dwVersionMS = MAKELONG(Mlo,Mhi);
        dwVersionLS = MAKELONG(mlo,mhi);
        return TRUE;
      }
     }
   }
  }
  // Failed: save error code and extended error info if any.
  m_dwError = GetLastError();
  if (m_dwError==ERROR_INTERNET_EXTENDED_ERROR) {
   DWORD dwErr;
   DWORD len = sizeof(m_errInfo)/sizeof(m_errInfo[0]);
   InternetGetLastResponseInfo(&dwErr, m_errInfo, &len);
  }
  return FALSE;
}

时间: 2024-10-27 21:44:48

基于Web的程序版本检查的相关文章

如何基于Web应用程序安全经验来开发云应用程序?

随着越来越多的企业 寻找可部署在云供应商环境中的应用程序,对于健全的安全措施和技术的需求也变得至关重要. 那么,如何在云环境中开发应用程序以最大限度地提高安全性呢?这些云应用程序是否有别于内部应用程序?在开发周期和质量保证(QA)过程中,需要有哪些变化?在把应用程序迁移到公共云环境之前,上述所有问题都需要解决.在本文中,我们将提供一些指导,如何专为云环境开发安全的应用程序,以抵御如今大部分常见攻击.我们还将探讨一些需要落实到位的控制因素,以确保基于云的应用程序在开发和部署时的安全性.如何安全地开

关于基于web的程序应用设计

问题描述 我想请问像设计一款完整的在电脑桌面上应用的程序需要哪些技术人才?比如哪种程序语言等方面 解决方案 解决方案二:具体点儿呗!应用程序太多了,您的先说说需求和预算啊.要做成什么或是想实现什么?

提升WEB应用程序安全需要打“组合拳”

由于WEB应用程序对于当今许多企业的内部和外部操作都极端重要,所以其可用性和安全性既是客户的期望又是其要求.因而,企业应该在WEB应用程序问题上不惜一切代价.同时,WEB应用程序的重要性也给安全专家带来巨大压力,因为没有什么会比企业的关键网站或应用被攻击.破坏更恐怖了.不幸的是,在构建应用程序的竞赛中,许多企业给开发者施加压力,要求其 重点关注应用程序的安全.本文将探讨如何在WEB应用程序的性能.可用性.安全性上达到平衡.安全策略在WEB应用程序安全问题上保持前瞻性和主动性应当成为IT的头等大事

8个实用且免费的Web应用程序安全测试工具

随着 Web 应用越来越广泛,Web 安全威胁日益凸显.黑客利用网站操作系统的漏洞和 Web 服务程序的 SQL 注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害.这也使得越来越多的用户关注应用层的安全问题,对 Web 应用安全的关注度也逐渐升温.下面向大家推荐8款非常有用的免费 Web 安全测试工具. N-Stalker Free Version N-Stalker Web 应用程序安全2012免费版本能够

Web应用程序安全必须重视八大问题

对于任何一个项目,开始阶段对于交付安全的应用来说非常关键.适当的安全要求会导致正确的安全设计.下面讨论在分析Web应用程序的安全要求时需要考虑的八大问题.1.认证和口令管理:这主要是一种一次性的活动而且仅仅是作为项目的一部分而完成的.有人可能会问一些与认证和口令管理有关的问题:◆口令策略:这个问题非常重要的原因在于避免与用户凭据有关的字典攻击.◆口令哈希算法:确保通过适当的加密算法来加密口令也非常重要.◆口令重置机制:为了避免黑客修改或截获口令,重置机制非常关键.2.认证和角色管理:在分析项目的

Web版本检查以及为应用程序添加声音效果

在 2003 四月的专栏文章中,你描述了如何实现一个叫 CWebVersion 的类,用它可以存取网络上的某个文件来检查软件的版本,当版本过期后提示用户更新程序.你的实现使用 FTP 来下载文件,但我的站点的 ISP 不允许使用匿名 FTP 连接,只能通过用户和口令登陆.我能不能用 HTTP 来代替 FTP,将版本文件作为 Web 页面下载. 如果没读过 2003 四月的专栏文章,我在这里简单介绍一下 CWebVersion 类,它是我编写的一个用来比较程序版本号的类,版本号文件存储在 Web

web2ldap 1.1.0a35发布 基于Web的LDAP客户端程序

web2ldap 是一个全功能的基于Web的LDAP客户端程序,采用Python语言编写,支持LDAPv3.web2ldap可以运行在支持 FastCGI 的Web 服务器中. web2ldap 1.1.0a35此版本改善了CSV导出,并增加了http://www.aliyun.com/zixun/aggregation/16544.html">Excel导出(基于pyExcelerator). 下载地址:http://www.web2ldap.de/download/web2ldap-1

掌握Ajax,第6部分: 建立基于DOM的Web应用程序

在不刷新页面的情况下使用 DOM 改变网页界面 简介:本系列的上一篇文章中考察了文档对象模型(DOM)编程中涉及到的概念--Web 浏览器如何把 网页看作一棵树,现在您应该理解了 DOM 中使用的编程结构.本期教程将把这些知识用于实践,建立一 个简单的包含一些特殊效果的 Web 页面,所有这些都使用 JavaScript 操纵 DOM 来创建,不需要重新加 载或者刷新页面. 前面两期文章已经详细介绍了文档对象模型或者 DOM,读者应该很清楚 DOM 是如何工作的了.(前两 期 DOM 文章以及

【竞争】亚马逊、沃尔玛分别发布基于Web应用的程序 挑战苹果网上

8月12日消息,据国外http://www.aliyun.com/zixun/aggregation/31646.html">媒体报道,亚马逊和沃尔玛两家零售商近日分别发布了基于Web应用的程序,看似有与苹果网上商城App Store进行挑战之势,亚马逊发布的是云阅读器应用程序Kindle,沃尔玛推出的则是流媒体服务应用程序VUDU. 最近,苹果公司在开始推行一项新市场政策,要让通过从App Store下载的应用程序的销售占整个收入的30%.由于两家零售商新推出的应用程序都可以通过浏览器访