下面的代码可以获取物理网线连接机器的MAC地址, 但是连接无线网络的笔记本就获取不到MAC, 求大神分析, 我的代码需要怎么改?
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;
/*if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)
{
pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];
pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];
pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];
pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];
pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];
pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];
} */
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;
}
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;
/*if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)
{
pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];
pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];
pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];
pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];
pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];
pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];
} */
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;
}
解决方案 »
- 介绍一个新手学习VC的免费视频网站
- 如何将自定义的OLE换件复制到WORD中去?
- VS2008 MFC连接SQL数据库
- VC6.0远程调试MSVCMON连接不上
- 请问关于在VC下写PRO C 分不够,可以再加
- 我用c++ builder创建的ActiveX library,打包需要包装那些文件呢?急啊!!!
- 请教如何编程实现发送Http请求到服务器上的asp文件。
- 如何编写参数个数与类型不确定的函数,如printf,scanf一样
- 请问一个很白痴的问题
- 本人菜鸟,跪求大神vc问题
- Activex控件中嵌入Flash控件,IE下收不到FSCommand事件
- CMFCMenuBar //怎么让字体变大,加背景色?要自绘?
具体百度吧