1. API, RasValidateEntryName, RasGetEntryProperties, RasSetEntryProperties, RasEnumEntries,RasSetEntryDialParams, RasDial, RasHangUp,RasDialFunc
2. Process,
a) CreatePhoneBookEntry:
i. DWORD RasValidateEntryName(LPCTSTR lpszPhonebook, LPCTSTR lpszEntry), 确定所要创建的DUN Name是否合法或是否已经存在.
ii. DWORD RasSetEntryProperties(LPCTSTR lpszPhonebook,LPCTSTR lpszEntry,LPRASENTRY lpRasEntry,DWORD dwEntryInfoSize,LPBYTE lpbDeviceInfo,DWORD dwDeviceInfoSize),按照一定属性配置创建一个新的DUN, 其中较为需要关注的是lpRasEntry, dwEntryInfoSize,两个参数;示例中lpRasEntry-> dwfOptions为0x3d2d0218,而dwEntryInfoSize和lpRasEntry-> dwSize均通过函数RasGetEntryProperties获得(其参数中,除lpdwEntryInfoSize外,其它参数均传入NULL)
b) SetPhbProperty/UpdatePhbProperty,使用函数DWORD RasEnumEntries(LPCTSTR reserved,LPCTSTR lpszPhonebook,LPRASENTRYNAME lprasentryname,LPDWORD lpcb,LPDWORD lpcEntries);枚举并找到特定的phb entry, 由此得到相应phk文件内对应的配置项(通常phk文件为alluser的appdata目录下//Microsoft//Network//Connections//Pbk//rasphone.pbk),通过修改这些配置项的方式,设置DUN的属性,比如WritePrivateProfileString(PhbEntryName, “ShowMonitorIconInTaskBar”, “1”, PhkFilePath);为设置连接成功时系统托盘上显示网络连接图标。主要需要设置的为modem设备名,相应COM口号等。另一种更简单的方式是通过RasSetEntryProperties函数修改。
c) Connect:
i. DWORD RasDial(LPRASDIALEXTENSIONS lpRasDialExtensions,LPCTSTR lpszPhonebook,LPRASDIALPARAMS lpRasDialParams,DWORD dwNotifierType,LPVOID lpvNotifier,LPHRASCONN lphRasConn);通过之前创建的DUN发起拨号,可以通过参数lpRasDialParams临时修改number, user, psw等参数;lpvNotifier用来指定处理连接过程中的状态和事件的回调函数,其定义必须为void CALLBACK RasDialFunc(UINT unMsg,RASCONNSTATE rasconnstate,DWORD dwError);
ii. 连接成功时,系统将通过lphRasConn返回一个句柄,可通过这个句柄对该连接进行操作,比如hang up.
d) Process connect state/event,回调函数void CALLBACK RasDialFunc(UINT unMsg,RASCONNSTATE rasconnstate,DWORD dwError)将获得OS传回的拨号状态,拨号成功或失败后将停止
e) Disconnect, 函数DWORD RasHangUp(HRASCONN hrasconn);其中参数hrasconn通过RasDial函数传出的参数lphRasConn获得(This is a handle returned from a previous call to RasDial or RasEnumConnections.)。由于该函数返回并不意味着hang up动作完成,所以推荐通过以下代码来确认之后,再退出程序(或者继续进行下面流程)。
while(RasGetConnectStatus(m_hRasConn, &rascnnstatus) != ERROR_INVALID_HANDLE)
{
::Sleep(0);
}