在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(); } 需要注意的是,以上两段代码都没有运用多线程技术,当线路不好或页面很大时,你的程序就像是死了一样,没有反应。所以呢,你应当恰当地运用多线程技术,结合相关的状态回调函数,提供给用户一个友好的操作界面。当然,别忘了控制错误异常,这在网络编程中显得尤其重要
[聊天工具]解读珊瑚虫CoralQQ.ini代码的秘密 [系统软件]解析boot.ini文件,亲身经验 [VB.NET程序]Auto Complete combo Box(VB.NET Source Use API… [VB.NET程序]在 VB 中使用 Unicode API [VB.NET程序]API 更改系统菜单条目 [VB.NET程序]VB源码推荐:一个操作Ini文件的类 [VB.NET程序]在VB中调用Windows API的注意事项 [VB.NET程序]vb调用winInet API接口post数据到指定的url [VB.NET程序]如 何 用 API 播 放 CD [VB.NET程序]VB5.0与Windows API 间的呼叫技巧
|