GetMacAddrDlg.cpp
上传用户:qzzxgm
上传日期:2009-12-14
资源大小:1882k
文件大小:7k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // GetMacAddrDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "GetMacAddr.h"
  5. #include "GetMacAddrDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CGetMacAddrDlg dialog
  50. CGetMacAddrDlg::CGetMacAddrDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CGetMacAddrDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CGetMacAddrDlg)
  54. //}}AFX_DATA_INIT
  55. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  56. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  57. }
  58. void CGetMacAddrDlg::DoDataExchange(CDataExchange* pDX)
  59. {
  60. CDialog::DoDataExchange(pDX);
  61. //{{AFX_DATA_MAP(CGetMacAddrDlg)
  62. DDX_Control(pDX, IDC_LIST_MACS, m_ctrlAdaptersLst);
  63. //}}AFX_DATA_MAP
  64. }
  65. BEGIN_MESSAGE_MAP(CGetMacAddrDlg, CDialog)
  66. //{{AFX_MSG_MAP(CGetMacAddrDlg)
  67. ON_WM_SYSCOMMAND()
  68. ON_WM_PAINT()
  69. ON_WM_QUERYDRAGICON()
  70. ON_BN_CLICKED(IDC_BUTTON_GETADDR, OnGetaddr)
  71. //}}AFX_MSG_MAP
  72. END_MESSAGE_MAP()
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CGetMacAddrDlg message handlers
  75. BOOL CGetMacAddrDlg::OnInitDialog()
  76. {
  77. CDialog::OnInitDialog();
  78. // Add "About..." menu item to system menu.
  79. // IDM_ABOUTBOX must be in the system command range.
  80. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  81. ASSERT(IDM_ABOUTBOX < 0xF000);
  82. CMenu* pSysMenu = GetSystemMenu(FALSE);
  83. if (pSysMenu != NULL)
  84. {
  85. CString strAboutMenu;
  86. strAboutMenu.LoadString(IDS_ABOUTBOX);
  87. if (!strAboutMenu.IsEmpty())
  88. {
  89. pSysMenu->AppendMenu(MF_SEPARATOR);
  90. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  91. }
  92. }
  93. // Set the icon for this dialog.  The framework does this automatically
  94. //  when the application's main window is not a dialog
  95. SetIcon(m_hIcon, TRUE); // Set big icon
  96. SetIcon(m_hIcon, FALSE); // Set small icon
  97. // TODO: Add extra initialization here
  98. //将列表分成两列
  99. TCHAR rgtsz[4][10] = {_T("网卡序号"),_T("Mac地址")};
  100. LV_COLUMN lvcolumn;
  101. CRect rect;
  102. m_ctrlAdaptersLst.GetWindowRect(&rect);
  103. for(int i=0;i<2;i++)
  104. {
  105. lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT 
  106. | LVCF_WIDTH | LVCF_ORDER;
  107. lvcolumn.fmt = LVCFMT_LEFT;
  108. lvcolumn.pszText = rgtsz[i];
  109. lvcolumn.iSubItem = i;
  110. lvcolumn.iOrder = i;
  111. if(i == 0)
  112. lvcolumn.cx = rect.Width()/4;
  113. else
  114. lvcolumn.cx = (rect.Width()*3)/4; 
  115. m_ctrlAdaptersLst.InsertColumn(i, &lvcolumn);
  116. }
  117. return TRUE;  // return TRUE  unless you set the focus to a control
  118. }
  119. void CGetMacAddrDlg::OnSysCommand(UINT nID, LPARAM lParam)
  120. {
  121. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  122. {
  123. CAboutDlg dlgAbout;
  124. dlgAbout.DoModal();
  125. }
  126. else
  127. {
  128. CDialog::OnSysCommand(nID, lParam);
  129. }
  130. }
  131. // If you add a minimize button to your dialog, you will need the code below
  132. //  to draw the icon.  For MFC applications using the document/view model,
  133. //  this is automatically done for you by the framework.
  134. void CGetMacAddrDlg::OnPaint() 
  135. {
  136. if (IsIconic())
  137. {
  138. CPaintDC dc(this); // device context for painting
  139. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  140. // Center icon in client rectangle
  141. int cxIcon = GetSystemMetrics(SM_CXICON);
  142. int cyIcon = GetSystemMetrics(SM_CYICON);
  143. CRect rect;
  144. GetClientRect(&rect);
  145. int x = (rect.Width() - cxIcon + 1) / 2;
  146. int y = (rect.Height() - cyIcon + 1) / 2;
  147. // Draw the icon
  148. dc.DrawIcon(x, y, m_hIcon);
  149. }
  150. else
  151. {
  152. CDialog::OnPaint();
  153. }
  154. }
  155. // The system calls this to obtain the cursor to display while the user drags
  156. //  the minimized window.
  157. HCURSOR CGetMacAddrDlg::OnQueryDragIcon()
  158. {
  159. return (HCURSOR) m_hIcon;
  160. }
  161. //获得指定网卡序号的Mac地址
  162. void CGetMacAddrDlg::GetOneMac(int AdapterIndex)
  163. {
  164.     NCB ncb;
  165.     UCHAR uRetCode;
  166. ASTAT Adapter;
  167.     memset( &ncb, 0, sizeof(ncb) );
  168.     ncb.ncb_command = NCBRESET;
  169.     ncb.ncb_lana_num = AdapterIndex;   // 指定网卡号
  170. //首先对选定的网卡发送一个NCBRESET命令,以便进行初始化 
  171. uRetCode = Netbios( &ncb );
  172.     memset( &ncb, 0, sizeof(ncb) );
  173.     ncb.ncb_command = NCBASTAT;
  174.     ncb.ncb_lana_num = AdapterIndex;  // 指定网卡号
  175.     strcpy( (char *)ncb.ncb_callname,"*" );
  176. // 指定返回的信息存放的变量 
  177.     ncb.ncb_buffer = (unsigned char *) &Adapter;
  178. ncb.ncb_length = sizeof(Adapter);
  179. // 发送NCBASTAT命令以获取网卡的信息 
  180. uRetCode = Netbios( &ncb );
  181.     if ( uRetCode == 0 )
  182.     {
  183. // 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802 
  184. CString strMacAddr;
  185. strMacAddr.Format( "%02X%02X-%02X%02X-%02X%02Xn",
  186. Adapter.adapt.adapter_address[0],
  187. Adapter.adapt.adapter_address[1],
  188. Adapter.adapt.adapter_address[2],
  189. Adapter.adapt.adapter_address[3],
  190. Adapter.adapt.adapter_address[4],
  191. Adapter.adapt.adapter_address[5] );
  192. //将网卡地址和序号存入数组中
  193. ADPTSTRCT AdptSt;
  194. AdptSt.nIndex = AdapterIndex;
  195. AdptSt.strMac = strMacAddr;
  196. m_arrAdapters.Add(AdptSt);
  197.     }
  198. }
  199. void CGetMacAddrDlg::OnGetaddr() 
  200. {
  201. NCB Ncb; 
  202.     UCHAR uRetCode; 
  203. LANA_ENUM lenum; 
  204. int i = 0; 
  205. memset(&Ncb, 0, sizeof(Ncb)); 
  206. Ncb.ncb_command = NCBENUM; 
  207. Ncb.ncb_buffer = (UCHAR *)&lenum; 
  208. Ncb.ncb_length = sizeof(lenum); 
  209. //向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等 
  210. uRetCode = Netbios( &Ncb ); 
  211. //获得所有网卡信息
  212. for(i=0; i < lenum.length ;i++)
  213. {
  214. GetOneMac(lenum.lana[i]);
  215. }
  216. //将保存到数组中的所有网卡信息在列表中显示
  217. int iActualItem;
  218. LV_ITEM lvitem;
  219. TCHAR buffer[128];
  220. for(int iItem=0;iItem<m_arrAdapters.GetSize();iItem++)
  221. {
  222. for(int iSubItem=0;iSubItem<2;iSubItem++)
  223. {
  224. lvitem.mask = LVIF_TEXT|(iSubItem == 0? LVIF_IMAGE : 0);
  225. lvitem.iItem = (iSubItem == 0)? iItem : iActualItem;
  226. lvitem.iSubItem = iSubItem;
  227. lvitem.iImage = (iItem%2)?0:2;
  228. if (iSubItem == 0)
  229. {//序号
  230. sprintf(buffer,"%d", m_arrAdapters.GetAt(iItem).nIndex);
  231. lvitem.pszText = buffer;
  232. iActualItem = m_ctrlAdaptersLst.InsertItem(&lvitem);
  233. }
  234. else
  235. {//Mac地址
  236. sprintf(buffer,"%s",m_arrAdapters.GetAt(iItem).strMac);
  237. lvitem.pszText = buffer;
  238. m_ctrlAdaptersLst.SetItem(&lvitem);
  239. }
  240. }
  241. }
  242.      
  243. }