今天闲着无聊就想来做点试验,于是想到获得网卡的一些信息,开始网上狂搜,找到的方法都很麻烦,后来在一个Delphi技术网站发现一个简单方法,于是我将他代码翻译了一下,加入了一些其他的功能(他程序主要是获得MAC).下面详细介绍下方法.
获得MAC:
网上很多都是获得网卡信息然后在获得MAC,或者从注册表里读,不过这里介绍一个简单的方法
用到一个API
RPC_STATUS RPC_ENTRY UuidCreateSequential(UUID* Uuid);
这个API可以获得MAC地址
他返回信息如下
RPC_S_OK The call succeeded.
RPC_S_UUID_LOCAL_ONLY The UUID is guaranteed to be unique to this computer only.
RPC_S_UUID_NO_ADDRESS Cannot get Ethernet or token-ring hardware address for this computer.
正常返回是第一个
所以我们用下面的代码获得到MAC地址
long rt;
UUID ui;
char mac[6][10]={0};
CString temp;
CString Mac;
rt = UuidCreateSequential(&ui);
if (rt == RPC_S_OK)
{
_itoa(ui.Data4[2],mac[0],16);
_itoa(ui.Data4[3],mac[1],16);
_itoa(ui.Data4[4],mac[2],16);
_itoa(ui.Data4[5],mac[3],16);
_itoa(ui.Data4[6],mac[4],16);
_itoa(ui.Data4[7],mac[5],16);
}
for(int n=0;n<6;n++)
{
if (strlen(mac[n]) == 1)
{
temp.Format("0%s",mac[n]);
strcpy(mac[n],temp);
}
}
Mac.Format("%s.%s.%s.%s.%s.%s",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
SetDlgItemText(IDC_EDIT1,Mac);
这样就完成了第一个获得到MAC地址,至于为什么要循环一次是因为转成16进制以后是一位比如
0.0.0.0.0.0
但是MAC地址一般是16进制,所以是00所以加个0而已
00.00.00.00.00.00
下面是获得IP和主机名
char name[255]={0};
CString ip;
hostent *addr;
::AfxSocketInit();
if(gethostname(name,sizeof(name))==0)
{
if((addr=gethostbyname(name)) != NULL)
{
ip = inet_ntoa(*(in_addr*)*addr->h_addr_list);
}
}
SetDlgItemText(IDC_EDIT2,name);
SetDlgItemText(IDC_IPADDRESS1,ip);
这个原理很简单先获得主机名,然后通过主机名获得到对应的IP.
需要注意的是,开始需要引用
#i nclude <afxsock.h>
这样才可以正常获得主机名,
至于MAC需要使用到
Rpcrt4.dll
这个文件(系统目录下)
所以需要引用库和头文件
#i nclude "Rpcdce.h"
#pragma comment(lib,"Rpcrt4.lib")
这样这个最简单的获得MAC和IP以及主机名的程序就完成了.
///
/// This one works well if you only have one NIC
CString CFormatHtmNameView::GetMACAddr()
{
CString strReturn;
GUID uuid;
// In Win2k or higher, CoCreateGuid no longer returns a mac address, but UuidCreate
// Sequential does.
typedef RPC_STATUS (CALLBACK* UuidCreateSequential_t)(UUID*);
// This doesnt exist Pre win2k,
// in that case it uses CoCreateGuid (which will fail in 2k+) - mc
HMODULE hRpcrt4 = LoadLibrary("rpcrt4.dll"); // Attempt to load RPCRT4.DLL
if(hRpcrt4)
{
UuidCreateSequential_t fpUuidCreateSequential;
fpUuidCreateSequential = (UuidCreateSequential_t)
GetProcAddress(hRpcrt4, "UuidCreateSequential");
// Attempt dynamic load of UuidCreateSequential c
if(fpUuidCreateSequential)
{
// Create Sequential UUID for determination of MAC Address
fpUuidCreateSequential(&uuid);
}
else
{ // OS Doesnt support UuidCreateSequential, so fall back on CoCreateGuid
CoCreateGuid(&uuid);
}
FreeLibrary(hRpcrt4);
}
else
{ // OS Doesnt support UuidCreateSequential, so fall back on CoCreateGuid
CoCreateGuid(&uuid);
}
// Now Format The adapter address - mc
strReturn.Format("%2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X",
uuid.Data4[2],
uuid.Data4[3],
uuid.Data4[4],
uuid.Data4[5],
uuid.Data4[6],
uuid.Data4[7]);
return strReturn;
}