赛迪网 > IT技术 编程语言 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

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

发布时间:2006.08.16 02:50     来源:plwww    作者:

 

在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-CONNECTINTERNET-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();
}
需要注意的是,以上两段代码都没有运用多线程技术,当线路不好或页面很大时,你的程序就像是死了一样,没有反应。所以呢,你应当恰当地运用多线程技术,结合相关的状态回调函数,提供给用户一个友好的操作界面。当然,别忘了控制错误异常,这在网络编程中显得尤其重要


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 谈谈VB的数据库编程方式 (02-16) · 使用VB开发Windows环境下的串行通信程序 (04-23)
· 用VB6设计有趣的动画场景 (09-28) · --------监视你的 TCP/IP端口!!!(vb)--- (07-06)
· ****关于 OLE DB 和 .NET 的思考 (强烈推荐)* (01-12) · Unicode vs Ansi (10-19)
· 一个简单实用的 vb 加密/解密算法 (11-24) · VB术语表 (12-11)
· VB术语表 (02-27) · VB编程的必备技巧 (11-12)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管