如何用vc实现宽带拨号的问题很早就有人提过了,但网上很少有满意的解答,CSDN的高手们也不过一句“参见Rasdial”或“参见winxp sdk”了事。本着为人民服务的精神,我从国外某高手的代码中整理了两个函数,以方便各位同志使用。
以下代码基本来自“Ras高级编程”,一国外高手做的拨号统计软件。这代码下载自国内的某家论坛。若有人能指出论坛名称,不胜感谢。如果有人要下载ras高级编程的代码做深入研究,可以到我的网络硬盘http://bigeyex.ys168.com
在使用下列代码的时候别忘了在程序的开头加入
#include <ras.h>
#include <raserror.h>
还有就是在Object/Library Modules里加入
Rasapi32.lib
此外还要定义一个全局的
static HRASCONN hRasConn = NULL;
//这是获取当前ISP的代码。m_Providers是一个CListBox控件。
BOOL QueryConnections()
{
DWORD cbBuf;
DWORD cEntry;
UINT ndx;
char szMessage[256];
m_Providers.ResetContent();
DWORD dwRet;
LPBYTE lpBuffer;
LPRASENTRYNAME lpRasEntry = new RASENTRYNAME;
lpRasEntry->dwSize = sizeof(RASENTRYNAME);
cbBuf = sizeof(RASENTRYNAME);
//获得所有连接
dwRet = RasEnumEntries(NULL, NULL, lpRasEntry, &cbBuf, &cEntry);
delete lpRasEntry;
lpBuffer = new BYTE[cbBuf];
lpRasEntry = (LPRASENTRYNAME)lpBuffer;
lpRasEntry->dwSize = sizeof(RASENTRYNAME);
dwRet = RasEnumEntries(NULL, NULL, lpRasEntry, &cbBuf, &cEntry);
if (ERROR_BUFFER_TOO_SMALL == dwRet)
{
delete lpRasEntry;
lpRasEntry = NULL;
lpRasEntry = (LPRASENTRYNAME) new char[cbBuf];
if (NULL != lpRasEntry)
{
ZeroMemory(lpRasEntry, cbBuf);
lpRasEntry->dwSize = cbBuf;
dwRet = RasEnumEntries(NULL, NULL, lpRasEntry, &cbBuf, &cEntry);
}
else
dwRet = ERROR_NOT_ENOUGH_MEMORY;
}
if (0 != dwRet) // 其他错误
{
if (0 != RasGetErrorString((UINT)dwRet, szMessage, 256))
{
}
}
if (0 == cEntry)
{
delete lpRasEntry ;
return FALSE;
}
BOOL bSet = FALSE;
if (0 == dwRet)
{
for (ndx = 0; ndx < cEntry; ndx++)
{
m_Providers.InsertString(ndx, lpRasEntry[ndx].szEntryName);
if (lpRasEntry[ndx].szEntryName == sCurrentProvider)
{
m_Providers.SetCurSel(ndx);
bSet = TRUE;
}
}
if (!bSet)
{
m_Providers.SetCurSel(0);
sCurrentProvider = lpRasEntry[0].szEntryName;
}
}
delete lpRasEntry ;
return TRUE;
}
//这是拨号的程序,netuser是用户名,netpwd是拨号密码,sCurrentProvider是ISP
BOOL StartDial(CString netuser,CString netpwd,CString sCurrentProvider)
{
hRasConn = NULL;
RASDIALPARAMS rdParams;
char szBuf[256] = "";
ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
rdParams.dwSize = sizeof(RASDIALPARAMS);
lstrcpy(rdParams.szEntryName, sCurrentProvider);
lstrcpy(rdParams.szPhoneNumber, CString("P"));
CString un, pw;
un=netuser;
pw=netpwd;
lstrcpy(rdParams.szUserName, un);
lstrcpy(rdParams.szPassword, pw);
rdParams.szCallbackNumber[0] = '*';
rdParams.szDomain[0] = '*';
Sleep(400);
DWORD dwRet;
dwRet = RasDial(NULL, NULL, &rdParams, 0L, NULL, &hRasConn);
return TRUE;
}
//这是断开的代码
BOOL HangUp()
{
DWORD dwRet;
RASCONNSTATUS rStatus;
ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
rStatus.dwSize = sizeof(RASCONNSTATUS);
dwRet = RasGetConnectStatus(hRasConn, &rStatus);
if (dwRet != ERROR_INVALID_HANDLE)
{
RasHangUp(hRasConn);
dwRet = RasGetConnectStatus(hRasConn, &rStatus);
}
return TRUE;
}