無 MSDN 下取得 MAC 的方法(iphlpapi) |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
在 www.msdn.com 可以看到左邊的LIST中有 Welcome to the MSDN Library.....
我們往下找。可以看到 Win32 and COM Development
把+打開。可以看到 Networking
再打開。可以看到 Network Protocols
再打開。可以看到 Internet Protocol Helper
再打開。可以看到 SDK Documentation
再打開。可以看到 IP Helper
而這個就是這次我們要用的東西了。(以上,是花了不少時間去看。去讀,才知道要用這個東東的。
所以不要問我怎麼可以快速找到它。平時就要多看。這是一個工程人員的本份) 在它內部有個 GetAdaptersInfo 可以取得不少我們要的資料。
這時候。你會大叫一聲。喂喂喂。燒等一下。我家沒有DDK,MSDN。這種工具。
你介紹的方法。我會不能用。。。。。。。 你放心。我之所以要介紹就是要跟大家說,不見得要買MSDN,你要的東西 M$ 早就給你了。
只是你會比較”不好用”一點而已。 我們現在找到 GetAdaptersInfo 吧。
http://msdn.microsoft.com/library/en-us/iphlp/iphlp/getadaptersinfo.asp?frame=true 你可以看到。它連用法都寫在裡面了。
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen); 這是它的呼叫法。 這時,我們會看到我們缺的是什麼?
1.我們沒有 lib 可以用。所以compiler, link 時,會出錯,找不到 GetAdaptersInfo....
2.我們沒有 PIP_ADAPTER_INFO 及 PULONG 的宣告。(PS.這個在 iphlpapi.h 中。假設我們手頭也沒有) 我們可以在函數呼叫法那邊看到 pAdapterInfo 有連結。我們去找它吧。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/ip_adapter_info.asp
可以看到什麼?
typedef struct _IP_ADAPTER_INFO { struct _IP_ADAPTER_INFO* Next; DWORD ComboIndex; char AdapterName[MAX_ADAPTER_NAME_LENGTH 4]; char Description[MAX_ADAPTER_DESCRIPTION_LENGTH 4]; UINT AddressLength; BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; DWORD Index; UINT Type; UINT DhcpEnabled; PIP_ADDR_STRING CurrentIpAddress; IP_ADDR_STRING IpAddressList; IP_ADDR_STRING GatewayList; IP_ADDR_STRING DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t LeaseExpires; } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;而 PULONG 則是一個 point of unsigned long 接著。我們再一個一個檢視這個 _IP_ADAPTER_INFO 所需要的宣告。 IP_ADDR_STRING http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/ip_adapter_info.asp 又可以看到 typedef struct _IP_ADDR_STRING { struct _IP_ADDR_STRING* Next; IP_ADDRESS_STRING IpAddress; IP_MASK_STRING IpMask; DWORD Context; } IP_ADDR_STRING, *PIP_ADDR_STRING;而這次。我們要找的是 IP_MASK_STRING 按一下它的說明。 IpMask Specifies a structure type with a single member, String. The String member is a char array of size 16. This array holds the IP address mask. 既然這樣。那我們就自己宣告了。 typedef struct { char String[16]; } IP_MASK_STRING, *PIP_MASK_STRING;接著。我們要去我們的電腦中找一下 iphlpapi.dll 放在那邊。 我的是放在 c:\windows\system32\iphlpapi.dll 當然。你可以用 window 系統路徑來找到它。 再來我們可以做動態載入了。 當然,我們要先宣告一下,我們等一下要呼叫的函數囉。 typedef DWORD(CALLBACK * PGAINFO)(PIP_ADAPTER_INFO, PULONG); // 宣告一個函數指標 test() { HINSTANCE hInst; // 準備載入 DLL 用 DWORD index; PGAINFO pGAInfo; // 要承接傳回的函數指標用 hInst = LoadLibrary("c:\\windows\\system32\\iphlpapi.dll"); if (!hInst) ShowMessage("iphlpapi.dll not supported in this platform!"); else { pGAInfo = (PGAINFO)GetProcAddress(hInst, "GetAdaptersInfo"); // 取得函數指標 PIP_ADAPTER_INFO pInfo = NULL; PIP_ADAPTER_INFO pInfoTemp; ULONG ulsize = 0; pGAInfo(pInfo, &ulsize); pInfoTemp = pInfo = (PIP_ADAPTER_INFO)new(char[ulsize]); pGAInfo(pInfo, &ulsize); // 呼叫 GetAdaptersInfo 函數 while (pInfo) { index = pInfo->Index; char buf[256]; wsprintf(buf, "%d = X:X:X:X:X:X", index, (unsigned int)pInfo->Address[0], (unsigned int)pInfo->Address[1], (unsigned int)pInfo->Address[2], (unsigned int)pInfo->Address[3], (unsigned int)pInfo->Address[4], (unsigned int)pInfo->Address[5] ShowMessage(buf); } pInfo = pInfo->Next; } delete pInfoTemp; FreeLibrary(hInst); // 釋放掉 DLL }以上。教你一步一步做到在沒有MSDN的環境下取得 MAC, 當然,這個方法也適用於其它地方。 這是結合了 DLL 呼叫,及資料搜尋。 PS。我用的是 C Builder 4.0 版。 所以有些元件可能新版的都提供了。 如果新版的提供了。就把這一篇當做是找資料的方法吧。 PS.以上程式截自某專案部份程式碼。所截出之程式碼在完整程式上可以動作。 截出後請自行修改。不保證可以執行。:) |
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |