ras api win7 和 win xp 遍历时的不同
由于在调用RasEnumEntries和RasEnumConnections在xp和win7以上的操作系统中有所不同,所以在win7下正常的代码在xp不一定就可以。
主要是在win7 下可以给参数传NULL来得到所需要大小,而在xp下则不可以传NULL,在xp下只需要传一个对象的大小,然后得到所需大小。再进行分配存储空间,再进行遍历 。废话不说了,直接上代码了。
vector<CRasdilInfo> EnumAdslNames_win7(void)
{
vector<CRasdilInfo> retList;
DWORD dwCb = ;
DWORD dwRet = ERROR_SUCCESS;
DWORD dwEntries = ;
LPRASENTRYNAME lpRasEntryName = NULL;
// Call RasEnumEntries with lpRasEntryName = NULL. dwCb is returned with the required buffer size and
// a return code of ERROR_BUFFER_TOO_SMALL
// 用lpRasEntryName = NULL 来调用 RasEnumEntries, 其中dwCb是一个传出值, 用来返回成功调用所需的缓冲区的字节数.
dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &dwCb, &dwEntries);
// 函数成功返回0
if (dwRet == ERROR_BUFFER_TOO_SMALL){
// Allocate the memory needed for the array of RAS entry names.
// 分配遍历条目所需要的字节输
lpRasEntryName = (LPRASENTRYNAME) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
// 如果lpRasEntryName指针为NULL, 则说明分配内存失败
if (lpRasEntryName == NULL){
// cout << "HeapAlloc failed!" << endl;
//cout << "分配内存失败! " << endl;
return retList;
}
// The first RASENTRYNAME structure in the array must contain the structure size
// 数组中第一个 RASENRTYNAME 结构必须包含结构体的大小
lpRasEntryName[].dwSize = sizeof(RASENTRYNAME);
// Call RasEnumEntries to enumerate all RAS entry names
// 调用 RasEnumEntries 枚举所有的连接名称
dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &dwCb, &dwEntries); // If successful, print the RAS entry names
// 如果调用成功, 打印出每个连接的名称
if (ERROR_SUCCESS == dwRet){
// cout << "The following RAS entry names were found:" << endl;
for (DWORD i = ; i < dwEntries; i++){
//cout << i << " " << lpRasEntryName[i].szEntryName << endl;
CRasdilInfo obj;
obj.strEntryName = lpRasEntryName[i].szEntryName;
obj.strPhoneBook = lpRasEntryName[i].szPhonebookPath;
//GetRasParam(&obj.rasDialParam,obj.strPhoneBook.c_str(),obj.strEntryName.c_str());
retList.push_back(obj);
}
}
// Deallocate memory for the connection buffer
// 释放用于存放连接名称的内存
HeapFree(GetProcessHeap(), , lpRasEntryName);
// 赋值空指针
lpRasEntryName = NULL;
}else {
// There was either a problem with RAS or there are RAS entry names to enumerate
// 枚举连接名称出现的问题
if(dwEntries >= ){
// cout << "The operation failed to acquire the buffer size." << endl;
}else{
// cout << "There were no RAS entry names found:." << endl; }
}
return retList;
} vector<CRasdilInfo> EnumAdslNames_xp(void)
{
OutputDebugInfo("EnumAdslNames_xp");
vector<CRasdilInfo> retList;
DWORD dwCb = sizeof(RASENTRYNAME);
DWORD dwRet = ERROR_SUCCESS;
DWORD dwEntries = ; RASENTRYNAME ras_entry_name = {};
ras_entry_name.dwSize = sizeof(RASENTRYNAME);
LPRASENTRYNAME lpRasEntryName = &ras_entry_name; dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &dwCb, &dwEntries);
if(dwRet == ERROR_SUCCESS)
dwRet = ERROR_BUFFER_TOO_SMALL; if(dwRet != ERROR_BUFFER_TOO_SMALL && dwEntries > )
{
}
else if(dwRet == ERROR_BUFFER_TOO_SMALL && dwEntries > )
{
if(dwCb < (dwEntries * sizeof(RASENTRYNAME)))
dwCb = dwEntries * sizeof(RASENTRYNAME); lpRasEntryName = (LPRASENTRYNAME) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
dwRet = RasEnumEntries(NULL, NULL, lpRasEntryName, &dwCb, &dwEntries);
if(dwRet == ERROR_SUCCESS)
{
for (DWORD i = ; i < dwEntries; i++){
CRasdilInfo obj;
obj.strEntryName = lpRasEntryName[i].szEntryName;
obj.strPhoneBook = lpRasEntryName[i].szPhonebookPath;
retList.push_back(obj);
}
}
HeapFree(GetProcessHeap(), , lpRasEntryName);
lpRasEntryName = NULL; }
return retList;
}
vector<CRasdilInfo> EnumRasConnections_xp()
{
//OutputDebugInfoA("EnumRasConnections_xp");
DWORD dwCb = 704; //windows xp 固定为704
DWORD dwRet = ERROR_SUCCESS;
DWORD dwConnections = 0;
LPRASCONN lpRasConn = NULL;
RASCONN conn = {0};
lpRasConn = &conn;
lpRasConn->dwSize = 704;//windows xp 固定为704
dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
if(dwRet == ERROR_SUCCESS)
dwRet = ERROR_BUFFER_TOO_SMALL;
vector<CRasdilInfo> retList;
if (dwRet != ERROR_BUFFER_TOO_SMALL && dwConnections > 0)
{
}
else if(dwRet == ERROR_BUFFER_TOO_SMALL && dwConnections > 0)
{
// Allocate the memory needed for the array of RAS structure(s).
lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
// The first RASCONN structure in the array must contain the RASCONN structure size
lpRasConn[0].dwSize = 704;
// Call RasEnumConnections to enumerate active connections
dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
// If successful, print the names of the active connections.
if (ERROR_SUCCESS == dwRet){
wprintf(L"The following RAS connections are currently active:\n");
for (DWORD i = 0; i < dwConnections; i++){
//OutputDebugInfo("EnumRasConnections_xp %s\n", lpRasConn[i].szEntryName);
CRasdilInfo Obj;
Obj.strEntryName = lpRasConn[i].szEntryName;
Obj.strPhoneBook = lpRasConn[i].szPhonebook;
Obj.hRasConn = lpRasConn[i].hrasconn;
retList.push_back(Obj);
}
}
//Deallocate memory for the connection buffer
HeapFree(GetProcessHeap(), 0, lpRasConn);
lpRasConn = NULL;
}
// There was either a problem with RAS or there are no connections to enumerate
if(dwConnections >= 1){
wprintf(L"The operation failed to acquire the buffer size.\n");
}else{
wprintf(L"There are no active RAS connections.\n");
}
return retList;
}
vector<CRasdilInfo> EnumRasConnections_win7()
{ DWORD dwCb = ;
DWORD dwRet = ERROR_SUCCESS;
DWORD dwConnections = ;
LPRASCONN lpRasConn = NULL; // Call RasEnumConnections with lpRasConn = NULL. dwCb is returned with the required buffer size and
// a return code of ERROR_BUFFER_TOO_SMALL
dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
vector<CRasdilInfo> retList;
if (dwRet == ERROR_BUFFER_TOO_SMALL){
// Allocate the memory needed for the array of RAS structure(s).
lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
// The first RASCONN structure in the array must contain the RASCONN structure size
lpRasConn[].dwSize = sizeof(RASCONN); // Call RasEnumConnections to enumerate active connections
dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections); // If successful, print the names of the active connections.
if (ERROR_SUCCESS == dwRet){
wprintf(L"The following RAS connections are currently active:\n");
for (DWORD i = ; i < dwConnections; i++){
//wprintf(L"%s\n", lpRasConn[i].szEntryName);
CRasdilInfo Obj;
Obj.strEntryName = lpRasConn[i].szEntryName;
Obj.strPhoneBook = lpRasConn[i].szPhonebook;
Obj.hRasConn = lpRasConn[i].hrasconn;
retList.push_back(Obj);
}
}
//Deallocate memory for the connection buffer
HeapFree(GetProcessHeap(), , lpRasConn);
lpRasConn = NULL;
} // There was either a problem with RAS or there are no connections to enumerate
if(dwConnections >= ){
wprintf(L"The operation failed to acquire the buffer size.\n");
}else{
wprintf(L"There are no active RAS connections.\n");
}
return retList;
}
ras api win7 和 win xp 遍历时的不同的更多相关文章
- vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录
一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...
- win xp 安装 VS2010 时要重启是因为没安装WINDOWS INSTALLER 4.5
win xp 安装 VS2010 时要重启是因为没安装WINDOWS INSTALLER 4.5. 无意间看到VS2010安装列表中有一项是 WINDOWS INSTALLER 4.5 . 装这个玩意 ...
- SSL握手中win xp和SNI的那点事
SSL握手中win xp和SNI的那点事 一.背景需求server1-3使用不同的域名对外提供https服务,用nginx作为前端负载均衡器并负责https集中解密工作(以用户访问的域名为依据进行流量 ...
- Win7与Ubuntu双系统时卸载Ubuntu的方法
Win7与Ubuntu双系统时卸载Ubuntu的方法 [日期:2010-03-26] 来源:Ubuntu社区 作者:Ubuntu编辑 [字体:大 中 小] 1. 下载MBRFix工具,放 ...
- WIN XP蓝屏代码大全
转自:廊坊师范学院信息技术提高班---韩正阳 http://blog.csdn.net/jiudihanbing WIN XP蓝屏代码大全WIN XP蓝屏代码大全一.蓝屏含义 1.故障检查信息 *** ...
- 【原理探究】女朋友问我ArrayList遍历时删除元素的正确姿势是什么?
简介 我们在项目开发过程中,经常会有需求需要删除ArrayList中的某个元素,而使用不正确的删除方式,就有可能抛出异常.或者在面试中,会遇到面试官询问遍历时如何正常删除元素.所以在本篇文章中,我们会 ...
- java 集合list遍历时删除元素
本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...
- Java遍历时删除List、Set、Map中的元素(源码分析)
在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...
- 【Java】List遍历时删除元素的正确方式
当要删除ArrayList里面的某个元素,一不注意就容易出bug.今天就给大家说一下在ArrayList循环遍历并删除元素的问题.首先请看下面的例子: import java.util.ArrayLi ...
随机推荐
- 聊聊并发(四)——深入分析ConcurrentHashMap
线程不安全的HashMap 因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap,如以下代码 final HashM ...
- 【六】注入框架RoboGuice使用:(Singletons And ContextSingletons)
上一篇我们简单的介绍了一下RoboGuice的使用([五]注入框架RoboGuice使用:(Your First POJO Injection)),今天我们来看下单例以及上下文单例(ContextSi ...
- SpringMVC处理方法的数据绑定
一.SpringMVC数据绑定流程 Spring MVC通过反射机制对目标处理方法的签名进行解析,将请求消息中的信息以一定的方式转换并绑定到处理方法的入参中.数据绑定的核心部件是DataBinder, ...
- Objective-c:NSFileHandle类,创建流对象,对文件进行写入、读取的操作
NSFileHandle类:它需要配合NSFileManager文件管理类,对文件内容进行操作,写入数据.读取数据. 使用步骤: 1.打开文件获取NSFileHandle类的对象 2. ...
- Longest Common Prefix leetcode java
题目: Write a function to find the longest common prefix string amongst an array of strings. 题解: 解题思路是 ...
- 倒计时 总结 Timer Handler CountDownTimer RxJava MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- HTML5, CSS3, ES5新的web标准和浏览器支持一览 转
本文整理了一些最重要(或者说人气比较高罢)的新标准,虽然它们多数还只是w3c的草案,离Recommendation级别还早,却已经成为新一轮浏览器大战中备受追捧的明星,开发者社区里也涌现出大量相关的d ...
- 在web项目启动时执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...
- c语言中pthread的理解和使用
在头文件中看到#typedef unsigned long int pthread_t这句话怎么理解,pthread_t是一个什么类型呢? 相当于pthread_t实际是个unsigned long ...
- C++和.net的集合类对应
Here's what I've found (ignoring the old non-generic collections): Array - C array, though the .NE ...