利用GetIfTable ,GetIfEntry 实时判断网线插拔状态

来源:互联网 发布:2106淘宝查虚假交易 编辑:程序博客网 时间:2024/06/10 00:26

// testlinkDlg.h : header file
//

#if !defined(AFX_TESTLINKDLG_H__C0EDCF96_BB21_4A9D_B508_23DD96954F30__INCLUDED_)
#define AFX_TESTLINKDLG_H__C0EDCF96_BB21_4A9D_B508_23DD96954F30__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CTestlinkDlg dialog
#include "Iphlpapi.h"
#pragma comment(lib,"Iphlpapi")

class CTestlinkDlg : public CDialog
{
// Construction
public:
 CTestlinkDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
 //{{AFX_DATA(CTestlinkDlg)
 enum { IDD = IDD_TESTLINK_DIALOG };
 CListBox m_List;
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CTestlinkDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(CTestlinkDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 virtual void OnOK();
 afx_msg void OnTimer(UINT nIDEvent);
 afx_msg void OnButton1();
 afx_msg void OnBtnStop();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()

public:
 void UpdateUI();
 PMIB_IFROW m_pIfRow;
 PMIB_IFTABLE m_pIfTable;
 BOOL GetIfData();
 void tt();
 int m_nNetCnt;
 CString strNetWorkName;
 DWORD m_dwIndex;

};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TESTLINKDLG_H__C0EDCF96_BB21_4A9D_B508_23DD96954F30__INCLUDED_)

 

 

// testlinkDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testlink.h"
#include "testlinkDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define ALLOCATE_FROM_PROCESS_HEAP( bytes )  ::HeapAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, bytes )
#define DEALLOCATE_FROM_PROCESS_HEAP( ptr )  if( ptr ) ::HeapFree( ::GetProcessHeap(), 0, ptr )
#define REALLOC_FROM_PROCESS_HEAP( ptr, bytes ) ::HeapReAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, bytes )


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// Dialog Data
 //{{AFX_DATA(CAboutDlg)
 enum { IDD = IDD_ABOUTBOX };
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CAboutDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 //{{AFX_MSG(CAboutDlg)
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
 //{{AFX_DATA_INIT(CAboutDlg)
 //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CAboutDlg)
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestlinkDlg dialog

CTestlinkDlg::CTestlinkDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CTestlinkDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CTestlinkDlg)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestlinkDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CTestlinkDlg)
 DDX_Control(pDX, IDC_LIST2, m_List);
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestlinkDlg, CDialog)
 //{{AFX_MSG_MAP(CTestlinkDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_WM_TIMER()
 ON_BN_CLICKED(IDC_BUTTON1, OnBtnStop)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestlinkDlg message handlers

BOOL CTestlinkDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
 // TODO: Add extra initialization here
 m_dwIndex = 0;
 m_pIfTable = NULL;
 GetIfData();        //获取指定网卡数据 
 SetTimer(1,1000,NULL);

 return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestlinkDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestlinkDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestlinkDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

void CTestlinkDlg::OnOK()
{
 // TODO: Add extra validation here
}


void CTestlinkDlg::UpdateUI()
{
 DWORD dwOperStatusMy = 0;
 dwOperStatusMy = m_pIfRow->dwOperStatus;

 CString strText = "";
 switch ( dwOperStatusMy )
 {
 case MIB_IF_OPER_STATUS_NON_OPERATIONAL:
  //LAN adapter has been disabled, for example because of an address conflict.
  strText.Format("%d - 网线断开", dwOperStatusMy );
  break;
 case MIB_IF_OPER_STATUS_UNREACHABLE:
  //WAN adapter that is not connected.
  strText.Format("%d - 网线断开", dwOperStatusMy );
  break;
 case MIB_IF_OPER_STATUS_DISCONNECTED:
  //For LAN adapters: network cable disconnected. For WAN adapters: no carrier.
  strText.Format("%d - 网线断开", dwOperStatusMy );
  break;
 case MIB_IF_OPER_STATUS_CONNECTING:
  //WAN adapter that is in the process of connecting.
  strText.Format("%d - 网线断开", dwOperStatusMy );
  break;
 case MIB_IF_OPER_STATUS_CONNECTED:
  //WAN adapter that is connected to a remote peer.
  strText.Format("%d - 网线断开", dwOperStatusMy );
  break;
 case MIB_IF_OPER_STATUS_OPERATIONAL:
  strText.Format("%d - 网线正常", dwOperStatusMy );
  //Default status for LAN adapters
  break;
 default:
  break;
 }

 if ( m_nNetCnt == 0)
 { 
   strText.Format("没有可用的netadapter");
 }

 SetWindowText(strText);

}


BOOL CTestlinkDlg::GetIfData()
{
 tt();

 DWORD dwSize = 0;
 
// m_pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
 if (m_pIfTable == NULL)
 {
  m_pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));

  if ( NULL == m_pIfTable)
  {
   return FALSE;
  }
 }
 
 dwSize = sizeof (MIB_IFTABLE);
 
 if (GetIfTable(m_pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
 {
  FREE(m_pIfTable);
  m_pIfTable = NULL;  
  if (m_pIfTable == NULL)
  {
   m_pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
   if ( NULL == m_pIfTable)
   {
    return FALSE;
   }
  }
 }
 
    char temp[256]={0};

 if (GetIfTable(m_pIfTable, &dwSize, FALSE) == NO_ERROR)
 {
  m_List.ResetContent();
  for (int i = 0; i < (int) m_pIfTable->dwNumEntries; i++)
  {
   m_pIfRow = (MIB_IFROW *) & m_pIfTable->table[i];
   
   if ( m_pIfRow->dwType   == MIB_IF_TYPE_ETHERNET)
   { 
    //void PrintPhysicalAddress(const BYTE PhysAddr[], DWORD PhysAddrLen)
    DWORD dwPhysAddrLen = 0;
    dwPhysAddrLen = m_pIfRow->dwPhysAddrLen;
    CString strPhy = "";
    CString strPhyText = "";
    CString strTemp = m_pIfRow->bDescr;
    if( dwPhysAddrLen > 0 )
    {
     for(DWORD wIndex=0; wIndex < dwPhysAddrLen-1; ++wIndex)
     {
      strPhyText.Format("%02X-" , m_pIfRow->bPhysAddr[wIndex]);
      strPhy += strPhyText;
     }
     strPhyText.Format("%02X" , m_pIfRow->bPhysAddr[wIndex]);
     strPhy += strPhyText;
    }

    sprintf(temp,"名称:%s 物理地址:%s  数量:%d/n", strTemp, strPhy, m_nNetCnt);

    if ( 0 == strNetWorkName.CompareNoCase(strTemp))
    {
     m_List.AddString(temp);
     m_dwIndex = i;
    }
   }
  }
  
 }
 return TRUE;
}


void CTestlinkDlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 GetIfData();

 //m_pIfRow->dwIndex = m_pIfTable->table[m_dwIndex].dwIndex;
 
 m_pIfRow = (MIB_IFROW *)&m_pIfTable->table[m_dwIndex];

 if (GetIfEntry(m_pIfRow) != NO_ERROR)
 {
  KillTimer(1);
 }
 
 UpdateUI();
 
 CDialog::OnTimer(nIDEvent);
}

void CTestlinkDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 
}

void CTestlinkDlg::OnBtnStop()
{
 // TODO: Add your control notification handler code here
 KillTimer(1);
}


void CTestlinkDlg::tt()
{
 IP_ADAPTER_INFO* pAdptInfo = NULL;
 IP_ADAPTER_INFO* pNextAd = NULL; 
 ULONG ulLen     = 0;
 int nCnt     = 0;
 DWORD erradapt;

 erradapt = ::GetAdaptersInfo( pAdptInfo, &ulLen );
 if( erradapt == ERROR_BUFFER_OVERFLOW )
 {
  pAdptInfo = ( IP_ADAPTER_INFO* )ALLOCATE_FROM_PROCESS_HEAP( ulLen );
  erradapt = ::GetAdaptersInfo( pAdptInfo, &ulLen );  
 }

 pNextAd = pAdptInfo;
 while( NULL != pNextAd )
 {
  CString strText = "";
  strText =  pNextAd->Description;
  strNetWorkName = strText;
  nCnt++;
  pNextAd = pNextAd->Next; 
 }
  
    m_nNetCnt = nCnt; 
 return ;
}

 

摘自::

请问:在WIN2000下,当拔开网线的时候,右下角的图标显示红色打叉状态,
请问可以用什么API函数可以检测到吗?

--------------------------------------------------------------- 感谢您使用微软产品。

您可以使用GetIfEntry API实现您需要的功能。
GetIfEntry将返回的信息保存在MIB_IFROW结构中,其中dwOperStatus属性描述了当前网卡的工作状态,包括正常工作、被禁用及网线未连接等。

关于GetIfEntry()的使用帮助请参考
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tcpip/tcpip_56nt.asp
关于MIB_IFROW结构的详细信息请参考
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rras/mibref_0b07.asp

- 微软全球技术中心 VC技术支持

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。

为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。

http://msdn.microsoft.com/en-us/library/aa366836(VS.85).aspx

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脚底长湿疹很痒怎么办 怀孕脚痒怎么办小窍门 孕妇烂脚丫和痒怎么办 腿上都是红血丝怎么办 全身皮肤干痒怎么办啊 脸过敏干痒脱皮怎么办 脸过敏了特别干怎么办 太阳晒后皮肤红怎么办 皮肤晒过后很痒怎么办 脸突然又红又痒怎么办 膝盖又红又痒怎么办 脸又红又痒怎么办 皮肤红痒有点热怎么办 浑身起红疙瘩 痒怎么办 身上长红包很痒怎么办 喝酒后身上很痒怎么办 身上长了小红包怎么办 腿长红包很痒怎么办 14岁脸上有雀斑怎么办 皮肤痒起红点或红块怎么办 脸过敏像长痱子怎么办 脸上有淡淡白块怎么办 过敏了脸上会起小疙瘩怎么办 脸过敏出红疙瘩怎么办 脸上长红色的小疙瘩怎么办 脸上都是小米粒痘痘怎么办 小孩身上起风团疙瘩怎么办 脸上长疙瘩很痒怎么办 一个多月宝宝脸上有湿疹怎么办 脸上发红发痒起疙瘩怎么办 脸过敏了怎么办最简单 胸下垂应该怎么办19岁 身上的肉特别松怎么办 才30岁脸部松弛怎么办 脸上的皮肤很松怎么办 面部皮肤干燥起皮刺痛怎么办 脸上的皮肤很粗糙怎么办 脸上又红又痒怎么办 鲜红斑痣增生了怎么办 激光祛斑后色素沉着怎么办 白球鞋洗后发黄怎么办