贴一点代码(用VC实现在WINXP下的宽带拨号)

贴一点代码(用VC实现在WINXP下的宽带拨号)
2007-03-31 17:23

如何用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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于在VC实现稳定的串口通讯并且在线程中进行串口读取的代码,您可以参考以下示例: 首先,您需要包含以下头文件: ```cpp #include <Windows.h> #include <stdio.h> ``` 接下来,定义一个线程函数来读取串口数据: ```cpp DWORD WINAPI SerialReadThread(LPVOID lpParam) { HANDLE hSerial = (HANDLE)lpParam; DWORD bytesRead; char buffer[1024]; while (1) { // 读取串口数据 if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) { // 处理读取错误 // ... } // 处理接收到的数据 // ... } return 0; } ``` 然后,在主函数中进行串口的初始化和线程的创建: ```cpp int main() { HANDLE hSerial; DCB dcbSerialParams = { 0 }; COMMTIMEOUTS timeouts = { 0 }; DWORD threadId; // 打开串口 hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial == INVALID_HANDLE_VALUE) { // 处理串口打开错误 // ... return 1; } // 配置串口参数 dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { // 处理获取串口参数错误 // ... CloseHandle(hSerial); return 1; } dcbSerialParams.BaudRate = CBR_9600; // 设置波特率为9600 dcbSerialParams.ByteSize = 8; // 设置数据位为8 dcbSerialParams.StopBits = ONESTOPBIT;// 设置停止位为1 dcbSerialParams.Parity = NOPARITY; // 设置校验位为无校验 if (!SetCommState(hSerial, &dcbSerialParams)) { // 处理设置串口参数错误 // ... CloseHandle(hSerial); return 1; } // 配置串口读取超时时间 timeouts.ReadIntervalTimeout = MAXDWORD; timeouts.ReadTotalTimeoutConstant = 0; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = 0; if (!SetCommTimeouts(hSerial, &timeouts)) { // 处理设置超时时间错误 // ... CloseHandle(hSerial); return 1; } // 创建串口读取线程 HANDLE hThread = CreateThread(NULL, 0, SerialReadThread, hSerial, 0, &threadId); if (hThread == NULL) { // 处理线程创建错误 // ... CloseHandle(hSerial); return 1; } // 等待线程结束 WaitForSingleObject(hThread, INFINITE); // 关闭串口和线程句柄 CloseHandle(hSerial); CloseHandle(hThread); return 0; } ``` 以上代码是一个简单的示例,实现了在VC下稳定的串口通讯并在线程中读取串口数据。您可以根据自己的需求进行修改和扩展。希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值