• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    在VB6中用WINDOWSAPI函數讀寫INI文件

    發布: 2007-5-25 09:21 | 作者: gnuljf | 來源: 互聯網 | 查看: 103次 | 進入軟件測試論壇討論

    領測軟件測試網  

    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();
      }
      需要注意的是,以上兩段代碼都沒有運用多線程技術,當線路不好或頁面很大時,你的程序就像是死了一樣,沒有反應。所以呢,你應當恰當地運用多線程技術,結合相關的狀態回調函數,提供給用戶一個友好的操作界面。當然,別忘了控制錯誤異常,這在網絡編程中顯得尤其重要

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>