WEB开发网
开发学院软件开发VC 基于 Web 的程序版本检查 阅读

基于 Web 的程序版本检查

 2006-07-21 11:09:14 来源:WEB开发网   
核心提示: WebVersion::Online 检查用户是否连接到 Internet,如果用户不在线,基于 Web 的程序版本检查(3),我会让你决定做什么——建议什么也别做,如果用户已经连接到 Internet,看看下面的代码就会明白: // 如果没有 CInternetH
  WebVersion::Online 检查用户是否连接到 Internet。如果用户不在线,我会让你决定做什么——建议什么也别做。如果用户已经连接到 Internet,则显示一个“版本检查”按钮,这样用户可以明确地发起与FTP服务器的连接(使用 WinInet 的InternetAttemptConnect 函数)。不论做什么都要先询问,再连接,不要太粗鲁。现在很多人都是用猫上网,一定要有一个友好的用户界面。 假设程序已经与 FTP 服务器连接上,为了读取版本信息,只要建立一个 CWebVersion 对象实例,同时将 FTP 服务器地址传入,然后用版本文件名作为参数调用 CWebVersion::ReadVersion 即可。ReadVersion 期望读到下面这样一行内容: 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: ////////////////////////////////////////////////////////////////
// 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;
  }
};
  这个类主要是封装 HINTERNET。其作用是为了方便进行错误处理。如果某个WinInet 函数调用失败,调用 GetLastError 会获取失败原因么。但 CloseInternetHandle 会清除出错代码,所以,必须在 CloseInternetHandle 之前调用 GetLastError。看看下面的代码就会明白: ////////////////////////////////////////////////////////////////
// 如果没有 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();
}

上一页  1 2 3 4  下一页

Tags:基于 Web 程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接