当前位置:编程学习 > VC++ >>

VC++实现拨号上网程序

 

 

  大家知道,在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)

补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,