C++ 硬體資訊 擷取網卡MAC地址,網卡mac
擷取電腦網卡MAC地址的方法很多,這裡採用的是命令列的形式擷取,可以擷取有線網卡與無線網卡的MAC地址,很簡單,直接
上代碼。
【1】標頭檔
#if !defined(AFX_95644697_C78F_4DD6_885B_3D7C40B2D55C__INCLUDED_)#define AFX_95644697_C78F_4DD6_885B_3D7C40B2D55C__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <iostream>#include <string>#include <windows.h>using namespace std;//--------------------------------------------------------------//網卡MAC地址//--------------------------------------------------------------BOOL GetMacByCmd(char *lpszMac, int len=128);#endif // !defined(AFX_95644697_C78F_4DD6_885B_3D7C40B2D55C__INCLUDED_)
【2】CPP檔案
#include "stdafx.h"#include "MacID.h"//--------------------------------------------------------------//網卡MAC地址//--------------------------------------------------------------BOOL GetMacByCmd(char *lpszMac, int len/*=128*/){const long MAX_COMMAND_SIZE = 10000; //命令列輸出緩衝大小WCHAR szFetCmd[]= L"ipconfig /all"; //擷取MAC命令列const string strEnSearch = "Physical Address. . . . . . . . . : "; //網卡MAC地址的前置資訊const string strChSearch = "物理地址. . . . . . . . . . . . . : ";BOOL bret = FALSE;HANDLE hReadPipe = NULL; //讀取管道HANDLE hWritePipe = NULL; //寫入管道PROCESS_INFORMATION pi; //進程資訊STARTUPINFOsi; //控制命令列視窗資訊SECURITY_ATTRIBUTES sa; //安全屬性charszBuffer[MAX_COMMAND_SIZE+1] = {0}; //放置命令列結果的輸出緩衝區stringstrBuffer;unsigned longcount = 0;longipos = 0;pi.hProcess = NULL;pi.hThread = NULL;si.cb= sizeof(STARTUPINFO);sa.nLength= sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle= TRUE;//1.0 建立管道bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);if(!bret){goto END;}//2.0 設定命令列視窗的資訊為指定的讀寫管道GetStartupInfo(&si);si.hStdError= hWritePipe;si.hStdOutput= hWritePipe;si.wShowWindow= SW_HIDE; //隱藏命令列視窗si.dwFlags= STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//3.0 建立擷取命令列的進程bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi );if(!bret){goto END;}//4.0 讀取返回的資料WaitForSingleObject (pi.hProcess, 2000/*INFINITE*/);bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);if(!bret){goto END;}//5.0 尋找MAC地址,預設尋找第一個,一般為乙太網路的MACstrBuffer = szBuffer;ipos = strBuffer.find(strEnSearch);if (ipos < 0)//區分中英文的系統{ipos = strBuffer.find(strChSearch);if (ipos < 1){goto END;}//提取MAC地址串strBuffer = strBuffer.substr(ipos+strChSearch.length());}else{//提取MAC地址串strBuffer = strBuffer.substr(ipos+strEnSearch.length());}ipos = strBuffer.find("\n");strBuffer = strBuffer.substr(0, ipos);memset(szBuffer, 0x00, sizeof(szBuffer));strcpy_s(szBuffer, strBuffer.c_str());//去掉中間的“00-50-EB-0F-27-82”中間的'-'得到0050EB0F2782int j = 0;for(int i=0; i<strlen(szBuffer); i++){if(szBuffer[i] != '-'){lpszMac[j] = szBuffer[i];j++;}}bret = TRUE;END://關閉所有的控制代碼CloseHandle(hWritePipe);CloseHandle(hReadPipe);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return(bret);}
【3】測試
char lpszMac[128] = {0};//擷取MACGetMacByCmd(lpszMac);//列印出MACcout << lpszMac << endl;
【已解決】分享 一段代碼:AIR 讀取硬體網卡MAC地址與IP地址資訊(一個術語)
用c#來獲得電腦使用中的網卡硬體的MAC地址
嘿嘿,我每次就直接在開始|運行裡,擷取的所有的MAC地址了也。
不知道有沒有你所說的虛擬網卡呢。
開始|運行|輸入“cmd”|再輸入“ipconfig -all”,斷行符號就行。