一个适用多个Window版本RAS检测类

来源:互联网 发布:石家庄java技术总监 编辑:程序博客网 时间:2024/06/18 04:52

这是我前不久遇到的一个问题,使用Windows的API函数RasEnumConnections检测RAS连接时,每个操作系统版本都必须提供不一样的RASCONN结构体,而我这个程序又必须能够运行在任何的Windows版本下,所以试着写了一个类模板

/* 文件:RasDetectT.h
 * 功能:检测、断开RAS连接
 * 作者:shootingstars (zhouhuis22 at sina.com.cn)
 * 日期:2004-11-4 20:18
 * 使用例子:
 *         CRasDetect *obj = CRasDetect::GetInstance();
 *        obj->EnumConnections();
 *        obj->HangupAll();    
 
*/
 

/* 结构体定义
 * 针对Windows的各个版本,定义不同的RASCONN结构体
 
*/

struct RASCONNWXP   //for WinXP/2003
{
 DWORD    dwSize;
 HRASCONN hrasconn;
 CHAR     szEntryName[ RAS_MaxEntryName 
+ 1 ];
 CHAR     szDeviceType[ RAS_MaxDeviceType 
+ 1 ];
 CHAR     szDeviceName[ RAS_MaxDeviceName 
+ 1 ]; 

 CHAR     szPhonebook [ MAX_PATH ];
 DWORD    dwSubEntry; 

 GUID    guidEntry;
 DWORD dwFlags;
 LUID    luid;
}
;
struct RASCONN2000  //for Win2000
{
 DWORD    dwSize;
 HRASCONN hrasconn;
 CHAR     szEntryName[ RAS_MaxEntryName 
+ 1 ];
 CHAR     szDeviceType[ RAS_MaxDeviceType 
+ 1 ];
 CHAR     szDeviceName[ RAS_MaxDeviceName 
+ 1 ];
 CHAR     szPhonebook [ MAX_PATH ];
 DWORD    dwSubEntry;
 GUID     guidEntry;
}
;
struct RASCONNNT4  //for WinNT4
{
 DWORD    dwSize;
 HRASCONN hrasconn;
 CHAR     szEntryName[ RAS_MaxEntryName 
+ 1 ];
 CHAR     szDeviceType[ RAS_MaxDeviceType 
+ 1 ];
 CHAR     szDeviceName[ RAS_MaxDeviceName 
+ 1 ]; 

 CHAR     szPhonebook [ MAX_PATH ];
 DWORD    dwSubEntry;
}
;
struct RASCONNW9X  //for Win98/95
{
 DWORD    dwSize;
 HRASCONN hrasconn;
 CHAR     szEntryName [ RAS_MaxEntryName 
+ 1 ];
 CHAR     szDeviceType[ RAS_MaxDeviceType 
+ 1 ];
 CHAR     szDeviceName[ RAS_MaxDeviceName 
+ 1 ];
}


/*
 * 客户使用接口
 
*/

class CRasDetect
{
public:
 
virtual bool EnumConnections() = 0// 枚举所有RAS连接
 virtual bool HangupAll() = 0;       // 断开所有RAS连接
 virtual bool Hangup(int index) = 0// 断开某个(index)RAS连接
 static  CRasDetect *GetInstance();  // 返回特定操作系统版本的CRasDetectT对象(Singleton模式,不支持多线程)
private:
 
static  CRasDetect *Instance;
}
;
CRasDetect 
*CRasDetect::Instance = NULL; 

template 
<class RASCONNT>
class CRasDetectT : public CRasDetect
{
public:
 CRasDetectT();
 
~CRasDetectT();
 
bool EnumConnections();
 
bool HangupAll();
 
bool Hangup(int index);
protected:
 RASCONNT   
*m_lprasconn;
 DWORD     m_connectionCount;           
// 枚举获得的连接数目
 DWORD     m_structSize;                // 当前系统RASCONN结构体的大小
}


template 
<class RASCONNT>
CRasDetectT
<RASCONNT>::CRasDetectT()
{
 m_structSize 
= sizeof(RASCONNT);
}
 

template 
<class RASCONNT>
CRasDetectT
<RASCONNT>::~CRasDetectT()
{
}
 

template 
<class RASCONNT>
bool CRasDetectT<RASCONNT>::EnumConnections()
{
 m_lprasconn 
= (RASCONNT *)new BYTE[m_structSize];
 DWORD dwCb;
 dwCb 
= m_structSize;
 m_lprasconn
->dwSize = m_structSize;
 DWORD dwErr 
= RasEnumConnections(
  (RASCONN
*)m_lprasconn,
  
&dwCb,
  
&m_connectionCount);
 
if (ERROR_BUFFER_TOO_SMALL == dwErr)
 
{
  delete m_lprasconn;
  m_lprasconn 
= (RASCONNT *)new BYTE[m_structSize];
  m_lprasconn
->dwSize = m_structSize;
  dwErr 
= RasEnumConnections(
   (RASCONN
*)m_lprasconn,
   
&dwCb,
   
&m_connectionCount);
  
if(dwErr == ERROR_SUCCESS)
   
return true;
  
else 
   
return false;
 }

 
else if(dwErr == ERROR_SUCCESS)
  
return true;
 
else
  
return false;
}
 

template 
<class RASCONNT>
bool CRasDetectT<RASCONNT>::Hangup(int index)
{
 DWORD err 
= RasHangUp(m_lprasconn[index].hrasconn);
 
if(err == 0)
  
return true;
 
else
  
return false;
}
 

template 
<class RASCONNT>
bool CRasDetectT<RASCONNT>::HangupAll()
{
 
bool result = true;
 
for(DWORD i = 0 ; i < m_connectionCount ; i++)
  
if(!Hangup(i))
   result 
= false;
 
return result;
}
 

// 返回当前操作系统的CRasDetectT对象
CRasDetect* CRasDetect::GetInstance()
{
 
if(Instance)
  
return Instance; 

 OSVERSIONINFOEX osvi;
 BOOL bOsVersionInfoEx; 

 ZeroMemory(
&osvi, sizeof(OSVERSIONINFOEX));
 osvi.dwOSVersionInfoSize 
= sizeof(OSVERSIONINFOEX); 

 
if!(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *&osvi)) )
 
{
  osvi.dwOSVersionInfoSize 
= sizeof (OSVERSIONINFO);
  
if (! GetVersionEx ( (OSVERSIONINFO *&osvi) ) 
   
return NULL;
 }
 

 
switch(osvi.dwPlatformId)
 
{
 
case VER_PLATFORM_WIN32_WINDOWS: // Win95/Win98
  return new CRasDetectT<RASCONNW9X>;
 
case VER_PLATFORM_WIN32_NT:
  
if(osvi.dwMajorVersion>=5)       // Windows 2000( NT5.0 )
  {
   
if(osvi.dwMinorVersion >= 1)
   
{
    
return new CRasDetectT<RASCONNWXP>;
   }

   
else
   
{
    
return new CRasDetectT<RASCONN2000>;
   }

  }
  
  
else    // NT 4.0
  {
   
return new CRasDetectT<RASCONNNT4>;
  }
  
  
break;
 }

 
return NULL;
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 显卡装了没反应怎么办 笔记本关闭核显黑屏怎么办 驱动补丁被卸了怎么办 网络驱动被删了怎么办 新装系统网卡没驱动怎么办 核显没有dp口怎么办 苹果7屏幕太小了怎么办 苹果装系统卡住了怎么办 苹果7手机白屏黑苹果怎么办 衣服破了个洞怎么办 黑苹果自带升级怎么办 双显卡都禁用了怎么办 win10优盘识别不出来怎么办 黑苹果无限重启怎么办 水泥地面起砂怎么办?这几招很有用 跟老公没法过了怎么办 胃和肠子有点烂怎么办? 车的屏幕黑了怎么办 ios12玩游戏闪退怎么办 没网steam要登录怎么办 电脑有gta还需要安装怎么办 孤岛惊魂5卡顿怎么办 酷匠密码忘记了怎么办 战地1有时候卡死怎么办 战地一fps太低怎么办 Dnf与系统不兼容怎么办 使命召唤7显示w怎么办 战地3王者太卡怎么办 合金装备5消音器没了怎么办 红警基地没了怎么办 玩战地1帧数太低怎么办 战地1点游戏不开怎么办 ios耳机孔坏了怎么办? 吃泻药都不排便怎么办 上司离职了我该怎么办 我上司要辞职我怎么办 一方坚决不同意离婚我该怎么办 模拟农场车翻了怎么办 手机退出键坏了怎么办 dnf邮件发错了怎么办 手机提示sd卡已损坏怎么办