教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> VC++ >> VC++实现拨号上网程序 RSS订阅
处理 SSI 文件时出错
VC++实现拨号上网程序
处理 SSI 文件时出错
   大家知道,在Netants、DownLoad Expert等软件中都带有定时拨号上网下载软件的功能。而一般用户的拨号上网,利用的是Windows的Remote Access Service(RAS,远程访问服务)。下面介绍一下其在Visual C++下的实现。 
   Visual C++为我们提供了包含RAS API声明的“ras.h″头文件。要在程序中实现拨号上网功能,其大致过程如下: 
   1. 利用Modem拨号进行连接,应使用RasDial函数。 
   其声明如下: 
   DWORD Ras Dial(LPRASDIALEXTENSIONS lpRas DialExtensions,LPCTSTR lpszPhonebook,LPRASDIALPARAMS lp Ras DialParams,DWORD dw Notifier Type,LPVOID lpv Notifier, 
   LPHRASCONN lph Ras Conn ) 
   参数说明: 
   lpRasDialExtensions和lpszPhonebook:仅在Windows NT下有效,在Windows 95下,这两个参数被忽略。 
   lpRasDialParams:这个参数很重要,它指向一个RASDIALPARAMS结构,该结构包含以下几个成员: 
   dwSize:应设定为sizeof(RASDIALPARAMS); 
   szEntryName和szPhoneNumber:这两个参数有联系,szEntryName可以指定要建立的连接,比方说“我的连接”等等,这是处理用户已经在“拨号网络”里建立的连接的。这时,Modem将拨打你在“我的连接”中设定的ISP号码,此时szPhoneNumber成员设为空字符串“”即可;如果你要在程序中自行指定要拨打的ISP号码的话,szEntryName可以设定为空字符串“”,此时应设置szPhoneNumber为你的ISP号码(169,663等),特别的,对于用201电话卡来上网的情况,可以设为“201,,,账号,密码#,,ISP号码#”(其中“,”表示停顿一段时间(以等待确认账号,密码等),你可以根据自己所在位置的线路状况自行调节。 
   SzCallBackNumber,szDomain:设为空串“”即可。 
   SzUserName,szPassword:登录用户名和密码。如169公用账号guest,guest。 
   其他成员不必设置。 
   DwNotifierType:指定是由窗口还是由回调函数来处理确认消息。通过确认消息我们可以得到RasDial过程的当前状态。如“正在打开段口”,“正在验证用户名和密码”等。也可设为NULL。 
   dwNotifier:指定处理确认消息的窗口或回调函数。也可设为NULL。 
   LphRasConn:指向一个类型为HRASCONN的变量。在调用RasDial前必须指定为NULL,RasDial若成功返回,则将RAS连接的句柄存放于它所指向的变量中。我们也可以通过此句柄来断开连接。 
   只要在程序中适当位置调用RasDial函数即可建立连接。 
   2. 理确认消息以得到拨号过程的当前状态。 
   我们以指定窗口来处理确认消息为例说明如何得到拨号过程的当前状态。 
   在处理确认消息的对话框类(或视图类等)的实现代码中加入: 
   const UINT WM_RASEVENT = ::RegisterWindowMessageA(RASDIALEVENT); 
   在Message Map中手工加入消息映射:(****是你定义的对话框类名称) 
   BEGIN_MESSAGE_MAP(****, CDialog) 
   //AFX_MSG_MAP(****) 
   …… 
   ON_REGISTERED_MESSAGE(WM_RASEVENT, OnRasDialEvent)(<-加入此句) 
   //AFX_MSG_MAP 
   END_MESSAGE_MAP() 
   加入成员函数处理消息: 
   LRESULT CDialInfo::OnRasDialEvent(WPARAM wp, LPARAM lp) 
   { 
   RASCONNSTATE rasstate= (RASCONNSTATE)wp; 
   CListBox *info =(CListBox *)GetDlgItem(IDC_INFOLIST); 
   //用ListBox 控件(ID为IDC-INFOLIST)来显示状态) 
   switch(rasstate) 
   { 
   case RASCS_OpenPort: 
   info→AddString(_T(″打开端口……″)); 
   break; 
   case RASCS_PortOpened: 
   info→AddString(_T(″端口已打开.″)); 
   break; 
   case RASCS_ConnectDevice: 
   info→AddString(_T(″连接设备……″)); 
   break; 
   case RASCS_DeviceConnected: 
   info→AddString(_T(″设备已连接.″)); 
   break; 
   case RASCS_Authenticate: 
   info→AddString(_T(″验证用户及密码″)); 
   break; 
   case RASCS_Authenticated: 
   info→AddString(_T(″通过″)); 
   break; 
   case RASCS_Connected: 
   info->AddString(_T(″已连接″)); 
   reak; 
   case RASCS_Disconnected: 
   info->AddString(_T(″连接已断开″)); 
   m_hRasConn=NULL; 
   //可定义类型为HRASCONN的成员变量m_hRasConn来保存RAS连接的句柄。 
   //在调用RasDial时用指向m_hRasConn的指针作为lphRasConn参数。 
   //既然用m_hRasConn来保存连接句柄,连接断开后应重置为NULL. 
   break; 
   default: 
   return (LRESULT)0; 
   } 
   return (LRESULT)0; 
   } 
   3. 断开连接: 
   if (m_hRasConn != NULL) 
   { 
   RasHangUp(m_hRasConn); 
   m_hRasConn = NULL; 
   m_OnDial=TRUE; 
   :Sleep(2000); 
   } 
   注意 : 
   你也许注意到了以上代码中的Sleep函数,这里是必需的。需要一定时间来断开连接。如果不等待一段时间,计算机有可能无法正常关闭端口。导致下一次无法拨号,只有重新启动Windows才能解决。要预防此问题也可以调用RasGetConnectStatus函数,方法如下: 
   RASCONNSTATUS rStatus; 
   while(RasGetConnectStatus(m_hRasConn,&rStatus)!=ERROR_INVALID_HANDLE) 
   { 
   ::Sleep(0); 
   } 
   4.在以下情况下: 
   ① 浏览网页时有时会出现停止响应,重启explorer后任务栏上的连接状态图标也许会消失。 
   ② 希望在连接成功后,退出程序,再次执行此程序可选择断开连接。 
   可以调用RasEnumConnection函数来得到当前连接的句柄。 
   举例如下: 
   HRASCONN hRasConnect;DWORD dwBuffferSize, dwNumofConnections;//缓冲区大小,连接数 
   LPRASCONN lpRasConn; 
   lpRasConn = new RASCONN[3】;//最多可得到3个连接句柄,客户端程序其实不必设为3,因连接数有限,大部分仅一个连接。 
   lpRasConn[0】.dwSize = sizeof(RASCONN); 
   dwBuffferSize = 32* sizeof(RASCONN);//求出由3个RASCONN结构构成的缓冲区大小 
   RasEnumConnections(lpRas Conn, &dw Buffer Size, &dw Numof Connections);//此函数若成功则返回零。 
   for(DWORD i=0; i   { 
   hRasConnect = lpRasConn[i】.hrasconn;//RASCONN结构的hrasconn成员为RAS连接句柄 
   RasHangUp(hRasConnect); 
   ::Sleep(2000); 
   } 
   delete [] lpRasConn; 
   在Windows 98,Visual C++ 6.0下调试通过。 
   这样,一个实现基本拨号上网功能的程序就完成了。如果你要了解更多有关情况或服务器端程序设计,可以参考MSDN→Platform SDK→Networking and Distributed Services→Remote Access Service的有关内容。(湖北 李宁)

来源:编程技术-十度教育
作者:
关键字:
发表日期:2006-10-18 13:47:52

处理 SSI 文件时出错

上一篇:怎样在VC++中访问和修改注册表   下一篇:使用ADO编写数据库应用程序


2008-9-7 2:07:36
本文的相类似文章
在学习中进步 在进步中成长 教程中国相随您的成长之路
华腾联合科技股份有限公司版权所有
广告联系:Rosibo@163.com