64,680
社区成员
发帖
与我相关
我的任务
分享
STDMETHODIMP CWin32ShellCore::GetMACAddress(BSTR* bstrRet)
{
CStringA cstrMac;
IP_ADAPTER_INFO pAdapterInfo;
ULONG len = sizeof(pAdapterInfo);
if(GetAdaptersInfo(&pAdapterInfo, &len) != ERROR_SUCCESS)
{
LOG_WARN("GetAdaptersInfo ERROR!");
//GetAdaptersInfo获取失败,尝试用NetBios去获取
NCB ncb;
UCHAR uRetCode;
int num = 0;
LANA_ENUM lana_enum;
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBENUM; // 对网卡发送请求的命令,获取网卡数
ncb.ncb_buffer = (unsigned char*)&lana_enum;
ncb.ncb_length = sizeof(lana_enum);
struct ASTAT //copy头文件中定义
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuf[30];
};
//向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡
//每张网卡的编号等
uRetCode = Netbios(&ncb);
if (uRetCode == 0)
{
num = lana_enum.length;
LOG_DEBUG(_T("num = ")<<num);
//对每一张网卡,以其网卡编号为输入编号,获取其MAC地址
for(int i = 0; i < num; i++)
{
ASTAT Adapter;
memset(&ncb,0,sizeof(ncb)); //使用之前要使ncb结构清0
ncb.ncb_command=NCBRESET; //对选定的网卡发送命令,以便进行初始化
ncb.ncb_lana_num=lana_enum.lana[i];
uRetCode=Netbios(&ncb);
//
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBASTAT;
strcpy((char*)ncb.ncb_callname,"*");
ncb.ncb_buffer=(UCHAR*)&Adapter;
ncb.ncb_length=sizeof(Adapter);
//接着发送命令获取网卡信息
uRetCode=Netbios(&ncb);
if(uRetCode==0)
{
char mac[15];
sprintf(mac,"%02X%02X%02X%02X%02X%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]);
//cout<<lpmac<<endl;
LOG_DEBUG(_T("mac = ")<<mac);
cstrMac = mac;
}
else
{
//cout<<"exceptions:"<<(int)uRetCode<<endl;
LOG_WARN(_T("exceptions:")<<(int)uRetCode);
}
}
}
}
else
{
size_t i, j;
char * szMac = new char[16];
for (i = 0, j = 0; i < 5; ++i)
j += sprintf (szMac + j, "%02X", pAdapterInfo.Address[i]);
sprintf (szMac + j, "%02X", pAdapterInfo.Address[i]);
LOG_DEBUG("MAC address "<<szMac);
cstrMac = szMac;
LOG_DEBUG("MAC address "<<(LPCSTR)cstrMac);
*bstrRet = CComBSTR(CA2W(cstrMac)).Detach();
delete[] szMac;
}
cstrMac.MakeLower();
*bstrRet = CComBSTR(CA2W(cstrMac)).Detach();
return S_OK;
}