Remote Access Service

远程访问服务(RAS)是Windows 9X/NT/2000操作系统提供的系统服务器之一,通过电话线可以使单独的计算机接入网络,或通过两个RAS对拨使两个局域网互连,此项服务的功能可以使远程的计算机以较低的费用同网络连接,而且一旦建立了RAS连接,则可以使用其它的几乎所有的网络函数,对用户来说,实际上和通过网卡在基于网中进行数据传输是一样的。


使用 远程 访问 服务 (RAS) 来 创建 客户端 应用程序 。 这些 应用程序 显示 RAS 通用 对话框 、 管理 远程 访问 连接 和 设备 , 以及 操纵 电话簿 条目 。 RAS 也 提供 下一 代 服务器 功能 的 远程 访问 服务 (RAS) 的 Windows 。 RRAS 服务器 功能 如下 , 并 生成 在 远程 访问 服务 (RAS)。





远程 访问 服务 是 适用 于 任何 使用 广域网 (WAN) 链接 或 虚拟 专用 网络 (VPN) 的 计算 环境 。 RAS 使 它 能够 通过 WAN 链接 或 VPN 连接 到 网络 服务器 的 远程 客户端 计算机 。 远程 计算机 然后 在 服务器 上 的 功能 的 局域网 , 仿佛 远程 计算机 直接 连接 到 局域网 。 RAS API 使 程序员 可以 以编程方式 访问 的 RAS 功能 。



RAS API 被 用于 C/c + + 程序员 。 Microsoft Visual Basic 程序员 也 可以 找到 该 API 有用 。 程序员 应该 熟悉 物联网 概念 。



一些 在 RAS API 函数 仅 在 网络 服务器 上 的 支持 和 网络 客户端 上 只 支持 其他 函数 。 哪些 操作系统 支持 某 一 特定 功能 的 详细 信息 , 请参阅 文档 中 的 部分 要求 。



增强 的 RAS 功能 的 RRAS 是 可 用于 Windows NT Server 4.0 安装 RRAS 可再发行组件 。 RRAS 的 所有 功能 都 纳入 Windows 2000 服务器 , Windows Server 2003 和 Windows Server 2008 。 RRAS 应用程序 不能 运行 在 Windows NT 工作站 4.0 或 在 客户端 操作系统 , 如 Windows 95 上 。 哪些 操作系统 支持 某 一 特定 功能 的 详细 信息 , 请参阅 文档 中 的 部分 要求 。

CmFree

CmMalloc

ORASADFunc

RASADFunc

RasClearConnectionStatistics

RasClearLinkStatistics

RasConnectionNotification

RasCreatePhonebookEntry 新建拨号连接

RasCustomDeleteEntryNotify

RasCustomDial

RasCustomDialDlg

RasCustomEntryDlg

RasCustomHangUp

RasDeleteEntry

RasDeleteSubEntry

RasDial 拨号函数

RasDialDlg 拨号连接对话框

RasDialFunc

RasDialFunc1

RasDialFunc2

RasEditPhonebookEntry 编辑已有连接

RasEntryDlg

RasEnumAutodialAddresses

RasEnumConnections  列出所有活动的RAS连接

RasEnumDevices

RasEnumEntries

RasFreeEapUserIdentity

RasGetAutodialAddress

RasGetAutodialEnable

RasGetAutodialParam

RasGetConnectionStatistics

RasGetConnectStatus   获取连接状态

RasGetCountryInfo

RasGetCredentials

RasGetCustomAuthData

RasGetEapUserData

RasGetEapUserIdentity

RasGetEntryDialParams

RasGetEntryProperties

RasGetErrorString

RasGetLinkStatistics

RasGetNapStatus

RasGetProjectionInfo

RasGetProjectionInfoEx

RasGetQuarantineConnectionId

RasGetSubEntryHandle

RasGetSubEntryProperties

RasHangUp 挂断拨号连接

RasInvokeEapUI

RasMonitorDlg

RasPBDlgFunc

RasPhonebookDlg

RasRenameEntry

RasSetAutodialAddress

RasSetAutodialEnable

RasSetAutodialParam

RasSetCommSettings

RasSetCredentials

RasSetCustomAuthData

RasSetEapUserData

RasSetEntryDialParams

RasSetEntryProperties

RasSetSubEntryProperties

RasUpdateConnection

RasValidateEntryName

RAS Custom Scripting DLL Functions


下面引用

可参考



拨号和连接管理:
1. 拨号函数 : RasDial

DWORD RasDial(
               LPRASDIALEXTENSIONS lpRasDialExtensions,
               LPCRSTR lpszPhonebook,
               LPRASDIALPARAMS lpRasDialParams,
               DWORD dwNotifierType,
               LPVOID lpvNotifier,
               LPHRASCONN lphRasConn);
参数说明:
  (1)lpRasDialExtensions为RASDIALEXTENSIONS结构体变量
 

typedef struct tagRASDIALEXTENSIONS{
     DWORD dwSize;//必须设置为RASDIALEXTENSIONS结构体的长度(按字节)
     DWORD dwfOptions;//允许为使用RASDIAL扩展特性而设置为标志
     HWND  hwndParent;//不用,应该设置NULL字符
     ULONG_PTR reserved;//不用,应该设置0
   #if(WINVER>=0x500)
           ULONG_PTR reserved1;保留 应该设置0
           RASEAPINFO RasEapInfo;//Windows 2000上,允许指定"扩展性身份验证协议"(EAP)信息
   #endif 
   }RASDIALEXTENSIONS;  (2)lpRasDialParams
   lpRasDialParams为结果RASDIALPARAMS变量
   typedef struct _RASDIALPARAMS
   {


         DWORD dwSize;//结构体长度(按字节).有了这个标志,RAS便可以对程序使用的操作系统平台版本进行内部判断。因为不同的操作系统,这个结构体是不一样的
         TCHAR szEntryName[RAS_MaxEntryName+1];//允许标志一个电话薄条目,该条目包含在RASDIAL函数的 lpszPhonebook参数列出的电话薄文件内。该参数比较重要,因为电话薄条目能够使用户更好地指定RAS连接属性。如选定一个Modem或者一个 分帧协议等,但是,为了使用RasDial而指定一个电话薄条目并不是非用不可,可以选择使用。如果该字段为空,RasDial就会选择系统上安装的第一 个可以使用的Modem,并依据下一个参数szPhoneNumber来拨叫连接
         TCHAR szPhoneNumber[RAS_MaxPhoneNumber+1];//代表一个电话号码,优先于szEntryName指定的电话薄条目内包含的电话号码
         TCHAR szCallbackNumber[RAS_MaxCallbackNumber+1];//允许指定一个电话号码,RAS服务器可以给据这个号码回拨,如果RAS服务器允许有一个回拨号码,他就中断原来的连接,利用指定的回拨号码回拨。这个特性非常有用,因为服务器可以知道连接的用户来自何处。
         TCHAR szUserName[UNLEN+1];//标志RAS服务器上的用户进行身份验证时所用的登陆名
         TCHAR szPassword[PWLEN+1];//标志RAS服务器上的用户进行身份验证所用的密码
         TCHAR szDomain[DNLEN+1];//可选项,指定最初的电话薄字条目拨叫一个RAS多链路连接
          #if(WINVER>=0x401)
            DWORD dwSubEntry;//标志用户帐号所在的Windows 2000或者NT区域
            ULONG_PTR dwCallbackId;//允许把一个应用程序定义的值投递到一个RasDidalFunc2回拨函数中
         #endif
  }RASDIALPARAMS;
  
  (3)lpszPhonebook:识别到一个电话薄文件的路径


2. 断开拨号函数 : RasHangUp
DWORD RasHangUp(HRASCONN hrasconn);//hrasconn正在连接的句柄,也就是在上一个函数中的最后一个参数hRasConn所得到的值

3. 获取连接状态函数 : RasGetConnectStatus

DWORD RasGetConnectStatus(HRASCONN hrasconn,LPRASCONNSTATUS Iprasconnstatus);
   Iprasconnstatus为一个结构体RASCONNSTATUS,它取得当前连接状态
   typedef struct _RASCONNSTATUS{
     DWORD         dwSize;//结构体大小
     RASCONNSTATE rasconnstate;//一种连接状态
     DWORD         dwError;//返回值不是0,就取得具体的错误代码
     TCHAR         szDeviceType[RAS_MaxDeviceType+1];//连接所用的设备类型
     TCHAR         szDeviceName[RAS_MaxDeviceName+1];//当前设备名称
   }RASCONNSTATUS


  
  RAS的活动连接状态有很多。连接有3种活动状态:运行,暂停,中止
  运行:RasDial调用仍在进程当中,每一处运行状态活动都将提供进程状态分析
  暂停:表示RasDial需要更多的信息来建立连接,默认设置是取消暂停状态。在RASDIALEXTENSIONS结构中设置RDEOPT_PauseStates标志,便可以启用通知进程。当连接处于暂停状态时,可能有如下原因 :
    1 因为身份验证失败,用户需要提供新的登陆凭证
    2 密码过期,需要一个新密码
    3 用户密码需要提供一个回拨号码
  中止: 表示RasDial拨号失败,或者RasHangUp函数关闭连接
 
4. 枚举连接函数 : RasEnumConnections : 列出所有活动的RAS连接
DWORD RasEnumConnections(LPRASCONN lprasconn,LPDWORD lpcb,LPDWORD lpcConnections);
 
5. 子连接句柄RasGetSubEntryHandle  该函数允许为多连接中一个具体的字条目取得一个连接句柄,远程访问服务器利用这个投影信息来表示网络上的一个远程客户机,比如说,在一个分帧协议上建立一个连接的时候,这个连接采用的是IP协议,IP配置信息(如 分配的ip地址)就会从RAS服务器到客户机之间建立起来。要想获得PPP(点对点)分帧协议上的协议投影信息,就可以使用管理连接函数中的第3个函数 RasGetProjectionInfo。

6. RasGetProjectionInfo:

DWORD RasGetProjectionInfo(
   HRASCONN hrasconn, //连接句柄
   RASPROJECTION rasprojection, //枚举类型
   LPVOID lpprojection, //取得一个数据结构该结构和rasprojection中指定的枚举类型有关联
   LPDWORD lpcb //该函数返回时,变量Lpcb会得到包含获得投影信息所需要的缓冲区长度  );

 

相关函数:
1. RasEnumEntries :

Ras规定要获得所有连接,必须连续两次调用RasEnumEntries函数,第一次要获得需要的缓冲区的大小,然后申请该缓冲区;在第二次调用的时候才能够真正获得所有的连接。
 
2. 增加新的连接主要通过调用 :
RasCreatePhonebookEntry(GetSafeHwnd(), sCurrentProvider);//新建拨号连接

3 删除连接 :

{
     //结构体
     typedef DWORD (WINAPI* RDE)
     (
            LPCTSTR lpszPhonebook,  // pointer to full path and filename of 
            LPCTSTR lpszEntry    // pointer to an entry name to delete
     );
     // 载入动态库
     HINSTANCE hLib = LoadLibrary(_T("RASAPI32.DLL"));
     if (NULL == hLib) return;
     RDE rde = (RDE) GetProcAddress(hLib, "RasDeleteEntryA");
     if (rde != NULL)
     {
       rde(NULL, sCurrentProvider);
       QueryConnections();//查询连接状态
       QueryPhones(sCurrentProvider);查询目前的拨号情况
     }
     ::FreeLibrary(hLib);
   }


4. 编辑已有连接 :
RasEditPhonebookEntry(GetSafeHwnd(), NULL, sCurrentProvider);//编辑已有连接
 
5. 拨号 :

{
     RASDIALPARAMS rdParams;
     char  szBuf[256] = "";
     //--------------------------------------------------------------------------------
     ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
     rdParams.dwSize = sizeof(RASDIALPARAMS);
     //允许标志一个电话薄条目,该条目包含在RASDIAL函数的lpszPhonebook参数列出的电话薄文件内    
     //该参数比较重要,因为电话薄条目能够使用户更好地指定RAS连接属性。如选定一个Modem或者一个分帧协议等,
     //但是,为了使用RasDial而指定一个电话薄条目并不是非用不可,可以选择使用。如果该字段为空,
     //RasDial就会选择系统上安装的第一个可以使用的Modem,并依据下一个参数szPhoneNumber来拨叫连接
     //lstrcpy(rdParams.szEntryName, sCurrentProvider);//
     //rdParams.szPhoneNumber 代表一个电话号码,优先于szEntryName指定的电话薄条目内包含的电话号码
     
     int pd = atoi(theApp.GetIniString(gchMain, gchPulseDialing, "1"));
     if (1 == pd)
       lstrcpy(rdParams.szPhoneNumber, CString("P") + GetPhoneListSelection());
     else 
       lstrcpy(rdParams.szPhoneNumber, GetPhoneListSelection());
     //--------------------------------------------------------------------------------
     
     CString un, pw;
     un = theApp.GetIniString(sCurrentProvider, "UserName", "");
     pw = theApp.GetPassword(TRUE);
     lstrcpy(rdParams.szUserName, un);//标志RAS服务器上的用户进行身份验证时所用的登陆名
     lstrcpy(rdParams.szPassword, pw);//标志RAS服务器上的用户进行身份验证所用的密码
     //--------------------------------------------------------------------------------
     
     //允许指定一个电话号码,RAS服务器可以给据这个号码回拨,如果RAS服务器允许有一个回拨号码,他就中断原来的连接,利用指定的回拨号码回拨
     //这个特性非常有用,因为服务器可以知道连接的用户来自何处
     rdParams.szCallbackNumber[0] = '*';
     rdParams.szDomain[0] = '*';//可选项,指定最初的电话薄字条目拨叫一个RAS多链路连接     //-------------------------------------------------------------------------------- 
 
     //拨号 
 
     DWORD dwRet; 
 
     dwRet = RasDial(NULL, 
 
       NULL, 
 
       &rdParams, 
 
       0L, 
 
       (LPVOID)RasDialFunc, 
 
       &hRasConn); 
 
     //-------------------------------------------------------------------------------- 
 
     if (dwRet) 
 
     { 
 
       if (RasGetErrorString((UINT)dwRet, (LPSTR)szBuf, 256) != 0) 
 
         m_LastCallText = szBuf; 
 
     } 
 
     return TRUE; 
 
   } 
 

   //回调函数 
 
   VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError) 
 
   { 
 
     TRACE("RasDialFunc\n"); 
 
     if (unMsg != WM_RASDIALEVENT) TRACE("Strange event!\n"); 
 
     TRACE("RasDialFunc - exit\n"); 
 
   }



6. 挂断拨号连接函数 :


RasHangUp(hRasConn);//中心函数()


RasGetConnectStatus(hRasConn, &rStatus);//获取连接状态函数





拨号和连接管理:
1. 拨号函数 : RasDial

DWORD RasDial(
               LPRASDIALEXTENSIONS lpRasDialExtensions,
               LPCRSTR lpszPhonebook,
               LPRASDIALPARAMS lpRasDialParams,
               DWORD dwNotifierType,
               LPVOID lpvNotifier,
               LPHRASCONN lphRasConn);
参数说明:
  (1)lpRasDialExtensions为RASDIALEXTENSIONS结构体变量
  typedef struct tagRASDIALEXTENSIONS{
    DWORD dwSize;//必须设置为RASDIALEXTENSIONS结构体的长度(按字节)
    DWORD dwfOptions;//允许为使用RASDIAL扩展特性而设置为标志
    HWND  hwndParent;//不用,应该设置NULL字符
    ULONG_PTR reserved;//不用,应该设置0
  #if(WINVER>=0x500)
          ULONG_PTR reserved1;保留 应该设置0
          RASEAPINFO RasEapInfo;//Windows 2000上,允许指定"扩展性身份验证协议"(EAP)信息
  #endif
  }RASDIALEXTENSIONS;

  (2)lpRasDialParams
  lpRasDialParams为结果RASDIALPARAMS变量
  typedef struct _RASDIALPARAMS
  {
         DWORD dwSize;//结构体长度(按字节).有了这个标志,RAS便可以对程序使用的操作系统平台版本进行内部判断。因为不同的操作系统,这个结构体是不一样的
         TCHAR szEntryName[RAS_MaxEntryName+1];//允许标志一个电话薄条目,该条目包含在RASDIAL函数的 lpszPhonebook参数列出的电话薄文件内。该参数比较重要,因为电话薄条目能够使用户更好地指定RAS连接属性。如选定一个Modem或者一个 分帧协议等,但是,为了使用RasDial而指定一个电话薄条目并不是非用不可,可以选择使用。如果该字段为空,RasDial就会选择系统上安装的第一 个可以使用的Modem,并依据下一个参数szPhoneNumber来拨叫连接
         TCHAR szPhoneNumber[RAS_MaxPhoneNumber+1];//代表一个电话号码,优先于szEntryName指定的电话薄条目内包含的电话号码
         TCHAR szCallbackNumber[RAS_MaxCallbackNumber+1];//允许指定一个电话号码,RAS服务器可以给据这个号码回拨,如果RAS服务器允许有一个回拨号码,他就中断原来的连接,利用指定的回拨号码回拨。这个特性非常有用,因为服务器可以知道连接的用户来自何处。
         TCHAR szUserName[UNLEN+1];//标志RAS服务器上的用户进行身份验证时所用的登陆名
         TCHAR szPassword[PWLEN+1];//标志RAS服务器上的用户进行身份验证所用的密码
         TCHAR szDomain[DNLEN+1];//可选项,指定最初的电话薄字条目拨叫一个RAS多链路连接
          #if(WINVER>=0x401)
            DWORD dwSubEntry;//标志用户帐号所在的Windows 2000或者NT区域
            ULONG_PTR dwCallbackId;//允许把一个应用程序定义的值投递到一个RasDidalFunc2回拨函数中
         #endif
  }RASDIALPARAMS;
  
  (3)lpszPhonebook:识别到一个电话薄文件的路径


2. 断开拨号函数 : RasHangUp
DWORD RasHangUp(HRASCONN hrasconn);//hrasconn正在连接的句柄,也就是在上一个函数中的最后一个参数hRasConn所得到的值

3. 获取连接状态函数 : RasGetConnectStatus
DWORD RasGetConnectStatus(HRASCONN hrasconn,LPRASCONNSTATUS Iprasconnstatus);
  Iprasconnstatus为一个结构体RASCONNSTATUS,它取得当前连接状态
  typedef struct _RASCONNSTATUS{
    DWORD         dwSize;//结构体大小
    RASCONNSTATE rasconnstate;//一种连接状态
    DWORD         dwError;//返回值不是0,就取得具体的错误代码
    TCHAR         szDeviceType[RAS_MaxDeviceType+1];//连接所用的设备类型
    TCHAR         szDeviceName[RAS_MaxDeviceName+1];//当前设备名称
  }RASCONNSTATUS
  
  RAS的活动连接状态有很多。连接有3种活动状态:运行,暂停,中止
  运行:RasDial调用仍在进程当中,每一处运行状态活动都将提供进程状态分析
  暂停:表示RasDial需要更多的信息来建立连接,默认设置是取消暂停状态。在RASDIALEXTENSIONS结构中设置RDEOPT_PauseStates标志,便可以启用通知进程。当连接处于暂停状态时,可能有如下原因 :
    1 因为身份验证失败,用户需要提供新的登陆凭证
    2 密码过期,需要一个新密码
    3 用户密码需要提供一个回拨号码
  中止: 表示RasDial拨号失败,或者RasHangUp函数关闭连接
 
4. 枚举连接函数 : RasEnumConnections : 列出所有活动的RAS连接
DWORD RasEnumConnections(LPRASCONN lprasconn,LPDWORD lpcb,LPDWORD lpcConnections);
 
5. 子连接句柄RasGetSubEntryHandle  该函数允许为多连接中一个具体的字条目取得一个连接句柄,远程访问服务器利用这个投影信息来表示网络上的一个远程客户机,比如说,在一个分帧协议上建立一个连接的时候,这个连接采用的是IP协议,IP配置信息(如 分配的ip地址)就会从RAS服务器到客户机之间建立起来。要想获得PPP(点对点)分帧协议上的协议投影信息,就可以使用管理连接函数中的第3个函数 RasGetProjectionInfo。

6. RasGetProjectionInfo:
DWORD RasGetProjectionInfo(
  HRASCONN hrasconn, //连接句柄
  RASPROJECTION rasprojection, //枚举类型
  LPVOID lpprojection, //取得一个数据结构该结构和rasprojection中指定的枚举类型有关联
  LPDWORD lpcb //该函数返回时,变量Lpcb会得到包含获得投影信息所需要的缓冲区长度

  );

 

相关函数:
1. RasEnumEntries :

Ras规定要获得所有连接,必须连续两次调用RasEnumEntries函数,第一次要获得需要的缓冲区的大小,然后申请该缓冲区;在第二次调用的时候才能够真正获得所有的连接。
 
2. 增加新的连接主要通过调用 :
RasCreatePhonebookEntry(GetSafeHwnd(), sCurrentProvider);//新建拨号连接

3 删除连接 :

{
     //结构体
     typedef DWORD (WINAPI* RDE)
     (
            LPCTSTR lpszPhonebook,  // pointer to full path and filename of 
            LPCTSTR lpszEntry    // pointer to an entry name to delete
     );
     // 载入动态库
     HINSTANCE hLib = LoadLibrary(_T("RASAPI32.DLL"));
     if (NULL == hLib) return;
     RDE rde = (RDE) GetProcAddress(hLib, "RasDeleteEntryA");
     if (rde != NULL)
     {
       rde(NULL, sCurrentProvider);
       QueryConnections();//查询连接状态
       QueryPhones(sCurrentProvider);查询目前的拨号情况
     }
     ::FreeLibrary(hLib);
   }

4. 编辑已有连接 :
RasEditPhonebookEntry(GetSafeHwnd(), NULL, sCurrentProvider);//编辑已有连接
 
5. 拨号 :

{
     RASDIALPARAMS rdParams;
     char  szBuf[256] = "";
     //--------------------------------------------------------------------------------
     ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
     rdParams.dwSize = sizeof(RASDIALPARAMS);
     //允许标志一个电话薄条目,该条目包含在RASDIAL函数的lpszPhonebook参数列出的电话薄文件内    
     //该参数比较重要,因为电话薄条目能够使用户更好地指定RAS连接属性。如选定一个Modem或者一个分帧协议等,
     //但是,为了使用RasDial而指定一个电话薄条目并不是非用不可,可以选择使用。如果该字段为空,
     //RasDial就会选择系统上安装的第一个可以使用的Modem,并依据下一个参数szPhoneNumber来拨叫连接
     //lstrcpy(rdParams.szEntryName, sCurrentProvider);//
     //rdParams.szPhoneNumber 代表一个电话号码,优先于szEntryName指定的电话薄条目内包含的电话号码
     
     int pd = atoi(theApp.GetIniString(gchMain, gchPulseDialing, "1"));
     if (1 == pd)
       lstrcpy(rdParams.szPhoneNumber, CString("P") + GetPhoneListSelection());
     else 
       lstrcpy(rdParams.szPhoneNumber, GetPhoneListSelection());
     //--------------------------------------------------------------------------------
     
     CString un, pw;
     un = theApp.GetIniString(sCurrentProvider, "UserName", "");
     pw = theApp.GetPassword(TRUE);
     lstrcpy(rdParams.szUserName, un);//标志RAS服务器上的用户进行身份验证时所用的登陆名
     lstrcpy(rdParams.szPassword, pw);//标志RAS服务器上的用户进行身份验证所用的密码
     //--------------------------------------------------------------------------------
     
     //允许指定一个电话号码,RAS服务器可以给据这个号码回拨,如果RAS服务器允许有一个回拨号码,他就中断原来的连接,利用指定的回拨号码回拨
     //这个特性非常有用,因为服务器可以知道连接的用户来自何处
     rdParams.szCallbackNumber[0] = '*';
     rdParams.szDomain[0] = '*';//可选项,指定最初的电话薄字条目拨叫一个RAS多链路连接     //-------------------------------------------------------------------------------- 
 
     //拨号 
 
     DWORD dwRet; 
 
     dwRet = RasDial(NULL, 
 
       NULL, 
 
       &rdParams, 
 
       0L, 
 
       (LPVOID)RasDialFunc, 
 
       &hRasConn); 
 
     //-------------------------------------------------------------------------------- 
 
     if (dwRet) 
 
     { 
 
       if (RasGetErrorString((UINT)dwRet, (LPSTR)szBuf, 256) != 0) 
 
         m_LastCallText = szBuf; 
 
     } 
 
     return TRUE; 
 
   } 
 

   //回调函数 
 
   VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError) 
 
   { 
 
     TRACE("RasDialFunc\n"); 
 
     if (unMsg != WM_RASDIALEVENT) TRACE("Strange event!\n"); 
 
     TRACE("RasDialFunc - exit\n"); 
 
   }


6. 挂断拨号连接函数 :


RasHangUp(hRasConn);//中心函数()


RasGetConnectStatus(hRasConn, &rStatus);//获取连接状态函数