全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7153
推到 Plurk!
推到 Facebook!

無 MSDN 下取得 MAC 的方法(iphlpapi)

 
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-26 13:06:45 IP:203.69.xxx.xxx 未訂閱
在 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-27 00:06:29 IP:220.143.xxx.xxx 未訂閱
【轉貼】iphlpapi資料 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56547 借po一下 卡好記
系統時間:2024-05-19 3:10:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!