很少写博文,曾经在网上找了许多关于RAS拨号源码的文章,但看的都是一支半解,不是看不懂,只是写的不详,结果的确让自己费了许多心思,我所用到的RAS拨号,只要运用于无线网卡的拨号上网功能,如果还想实现其他功能的,欢迎交流,QQ:309354447。
我们想要在程序中建立一个RAS拨号的功能,首先建立一个VisualC的应用框架,在Setting中为应用程序加入Rasapi32.lib静态库,并添加头文件:#include "ras.h",
或者:#pragma comment(lib, "Rasapi32.lib")也可以。接着第二步:
声明公有函数:static void WINAPI RasDialFunc( UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError );再声明公有变量:HRASCONN hRasConn;
而RasDialFunc函数实现:则如下代码:
void WINAPI CRasDialDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
CRasDialDlg * RasDlg = (CRasDialDlg*)AfxGetApp()->m_pMainWnd;
RasDlg->PostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
CString str;
switch(rasconnstate)
{
case RASCS_OpenPort:
str= "正在打开端口...";
break;
case RASCS_PortOpened:
str= "端口已经打开";
break;
case RASCS_ConnectDevice:
str= "正在连接设备";
break;
case RASCS_DeviceConnected:
str= "设备已经连接";
break;
case RASCS_AllDevicesConnected:
str= "所有设备已经连接上";
break;
case RASCS_Authenticate:
str= "正在验证用户名和密码...";
break;
case RASCS_AuthNotify:
str= "IDS_RASCS_7";
break;
case RASCS_AuthRetry:
str= "再次验证用户名和密码...";
break;
case RASCS_AuthCallback:
str= "回收验证";
break;
case RASCS_AuthChangePassword:
str= "改变密码请求";
break;
case RASCS_AuthProject:
str= "开始连接状态";
break;
case RASCS_AuthLinkSpeed:
str= "计算连接速度...";
break;
case RASCS_AuthAck:
str= "Authentication Acknowledged";
break;
case RASCS_ReAuthenticate:
str= "Reauthenticatation Started";
break;
case RASCS_Authenticated:
str= "Authenticated";
break;
case RASCS_PrepareForCallback:
str= "Preparation For Callback";
break;
case RASCS_WaitForModemReset:
str= "等待设备重置...";
break;
case RASCS_WaitForCallback:
str= "Waiting For Callback";
break;
case RASCS_Interactive:
str= "Interactive";
break;
case RASCS_RetryAuthentication:
str= "再次验证";
break;
case RASCS_CallbackSetByCaller:
str= "Callback Set By Caller";
break;
case RASCS_PasswordExpired:
str= "密码过期";
break;
case RASCS_Connected:
str= "已经连接上";
break;
case RASCS_Disconnected:
str= "已经断开连接";
break;
default:
str= "未定义的错误代码";
break;
}
AfxGetMainWnd()->SetDlgItemText(IDC_STATIC_STATE,str);
}
//拨号功能实现如下:
void CRasDialDlg::OnButton1() //连接网络
{
RASDIALPARAMS rdParams; //拨号连接的信息
ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
rdParams.dwSize = sizeof(RASDIALPARAMS);
lstrcpy(rdParams.szEntryName, "CDMA Express Data Card");
lstrcpy(rdParams.szUserName, "card");
lstrcpy(rdParams.szPassword, "card");
hRasConn = NULL;
DWORD dwRet = RasDial(NULL, NULL, &rdParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
if(dwRet)
{
CString szMsg;
if(RasGetErrorString((UINT)dwRet, szMsg.GetBuffer(256),256)!=0)
{
szMsg.ReleaseBuffer();
szMsg.Format("未知的远程访问错误,错误代码为:%ld.",dwRet);
}
else
szMsg.ReleaseBuffer();
CString buf;
buf.Format("错误代码为:%ld.",dwRet);
szMsg += buf;
MessageBox(szMsg,"拨号失败",MB_OK|MB_ICONSTOP);
hRasConn = NULL;
}
}
//断开拨号连接功能如下:
void CRasDialDlg::OnButton2()
{
SetDlgItemText(IDC_STATIC_STATE,"正在断开网络,请稍候...");
RASCONN ras[20];
DWORD dwSize, dwNumber, dwCount;
ras[0].dwSize=sizeof(RASCONN);
dwSize =sizeof(ras);
if (::RasEnumConnections(ras, &dwSize, &dwNumber)==0)
{
for (dwCount=0; dwCount<dwNumber; dwCount++ ) //依次关闭所有的连接
{
if (::RasHangUp(ras[dwCount].hrasconn)!=0) //如果函数成功,则返回0
{
break;
}
else
{
SetDlgItemText(IDC_STATIC_STATE,"已断开网络");
}
}
}
}
这就是实现RAS拨号程序功能的简单实现,有不妥之处,欢迎指正。