在VB6中用WINDOWS API函数读写INI文件

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 gnuljf 的 blog

 

在vb6中用windows api函数读写ini文件


   wininet(win32 internet functions)提供给程序员一套完整的internet调用函数,它被包含在一个名为wininet.dll的动态联接库里。通过它可以轻松地完成对http,ftp以及gopher的访问。比如下载html页面;发送ftp请求从而上传或下载文件还可浏览目录列表,典型的应用是可以通过匿名登录获取文件,还有你更新自己的主页时上传文件;gopher的菜单系统使你可以获取英特网上的资源。对于这三个协议来说,使用它们的步骤是相同的:建立联接——向服务器提出请求——关闭联系。当然你也可以通过mfc(microsoft foundation class)更为简单地(甚至是傻瓜式地)使用wininet。因为在mfc中,你可以简单地像访问硬盘一样访问http、ftp以及gopher服务器(当然不是指可以乱涂乱画啦……);你更可以不去理睬winsock和tcp/ip;当然你完全有可能自己从底层写起,我想其中一个明显的原因是你认为mfc不够快,放心吧同志,这不是写3d游戏……不过要是你认为它不够灵活的话,那只有自己写了,没什么大不了的;还有就是你可以用现成的类(chttpfile、cftpfilefind、cgopherfilefind)控制你的数据,因为这些类把这三个协议抽象到了高层的应用程序编程界面,提供快速并且简单的方法。所以对于用visual c++的你来说,你至少有两种方法来使用wininet:直接调用win32 internet functions和mfc。下面就分别用这两种方法通过http下载web页面,为了更明朗地说明问题,假设网络畅通无阻,所以你会看到下面的代码都没有错误或异常处理。准备好一个单文档界面的自动生成项目,它的视的基类最好是ceditview,这样可以直接把获取的信息显示出来;添加一个工具栏图标,在视中相应消息ongethttp()。
  首先通过直接调用win32 internet functions下载http://www.hust.edu.cn下的缺省页面,将要用到的下面几个函数:afxparseurl(或者它的扩展afxparseurlex)、internetopen、internetconnect、httpopenrequest、httpsendrequest、internetreadfile、internetclosehandle。不用多说,你也可以从它们的名字里猜出它们的功能,函数说明请可以参阅msdn。
  void cwininettestview::ongethttp()
  {
  //使用win32api获取页面
  cstring strurl = ″http://www.hust.edu.cn″;
  hinternet hsession;
  hinternet hconnect = null;
  hinternet hurl = null;
  try
  {
  cstring strserver,strobject;
  internet_port nport;
  dword dwservicetype;
  //分析给定的url, 取回服务信息
  afxparseurl(strurl,dwservicetype, strserver, strobject, nport);
  //初始化网络动态联接库,通常用户只需要调用一次internetopen,
  //但多次调用internetopen是允许的,
  //比如需要对不同的实例提供不同的代理服务器
  hsession=::internet open(″wininet test″,
  inter-net_open-type-preconfig,
  (lpctstr)null,
  null,0);
  //联接服务器
  hconnect=::internet connect(h session,strserver,
  inter-net-invalid-port-number,
  ″″, ″″,
  internet-service-http,
  0,0) ;
  const char *lpszaccepttypes[2] = {_t(″accept: text/* \r″), null};
  //获得指定的http句柄
  hurl = ::httpopenrequest(hconnect, ″get″, strobject,
  http_version, null, lpszaccepttypes,internet-flag-existing-connect|
  inter-net-flag-no_auto-redirect|
  internet-flag-dont-cache|
  internet-flag-reload,0) ;
  //向http服务器发送请求
  ::httpsendrequest(hurl,null,0,0,0);
  cstring stext;
  tchar sz[1024];
  dword dwbytesread;
  bool bokay = true;
  //循环接收
  while(bokay)
  {
  bokay = ::internetreadfile(hurl,sz,1023,&dwbytesread);
  if(bokay && dwbytesread > 0)
  {
  sz[dwbytesread-1] = &\0&
  stext = sz;
  stext.replace(_t(″\n″), _t(″\r\n″));
  geteditctrl().replacesel(stext);
  }
  else break;
  } }
  catch(……)
  {
  }
  //关闭相关句柄
  ::internetclosehandle(hurl);
  ::internetclosehandle(hconnect);
  ::internetclosehandle(hsession);
  }
  下面用mfc完成同样的工作,可以看得出,需要写的代码相对减少了,而且更为简单,当你写大程序时,这一点更为明显。需要用到的几个类是:cinternetsession、chttpconnection、chttpfile。
  void cwininet testview::ongethttp()
  {
  cinternetsession internetsession(″wininettest″, 1, pre-config-internet-access);
  chttpconnection* m-phttpserver;
  chttpfile* m-phttpfile;
  try
   {
  cstring strserver;
  cstring strobject;
  internet_port nport;
  dword dwservicetype;
  afxparseurl(strurl, dwservicetype, strserver, strobject, nport);
  m_phttpserver =internetsession.gethttp connection(strserver, nport);
  m-phttpfile=m-phttpserver→openrequest(chttpconnection::http-verb_get,
  strobject, null, 1, null, null, inter-net-flag-existing-connect|internet-flag-no-auto-redirect);
  m_phttpfile->addrequestheaders(_t(″accept: text/*\r\n″));
  m_phttpfile->sendrequest();
  cstring stext;
  tchar sz[1024];
  while (m_phttpfile->readstring(sz, 1023))
  {
  stext = sz;
  stext.replace(_t(″\n″), _t(″\r\n″));
  geteditctrl().replacesel(stext);
  } }
  catch(……)
  {
  }
  if (m_phttpfile != null)
  delete m_phttpfile;
  if (m_phttpserver != null)
  delete m_phttpserver;
  internetsession.close();
  }
  需要注意的是,以上两段代码都没有运用多线程技术,当线路不好或页面很大时,你的程序就像是死了一样,没有反应。所以呢,你应当恰当地运用多线程技术,结合相关的状态回调函数,提供给用户一个友好的操作界面。当然,别忘了控制错误异常,这在网络编程中显得尤其重要

本文关键:,在VB6中用WINDOWS API函数读写INI文件,
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top