请高手指点:如何检测网卡(硬件)是否存在?

lhydnxs 2005-02-20 11:35:15
最近编程碰到一个问题.在注册表中可以得到网卡ComponentId,DriverDesc,NetCfgInstanceId这些类似的信息,能否根据这些信息来检测网卡硬件是否存在呢?如果不能,要用什么方法呢?
请高手指点.我用的是VC6
...全文
252 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2005-02-23
  • 打赏
  • 举报
回复

?
BOOL ClassNetSetting::GetSettingOfWinNT()
{
LONG lRtn;
HKEY hMainKey;
TCHAR szParameters[256];
//获得域名,主机名和是否使用IP路由
_tcscpy(szParameters,_T("SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters"));
lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,szParameters,0,KEY_READ,&hMainKey);
if(lRtn == ERROR_SUCCESS)
{
DWORD dwType,dwDataSize = 256;
::RegQueryValueEx(hMainKey,_T("Domain"),NULL,&dwType,(LPBYTE)m_szDomain,&dwDataSize);
dwDataSize = 256;
::RegQueryValueEx(hMainKey,_T("Hostname"),NULL,&dwType,(LPBYTE)m_szHostName,&dwDataSize);
dwDataSize = 256;
// BYTE szBuf[16];
::RegQueryValueEx(hMainKey,_T("IPEnableRouter"),NULL,&dwType,(LPBYTE)&m_IPEnableRouter,&dwDataSize);
}
::RegCloseKey(hMainKey);

//获得IP地址和DNS解析等其他设置
HKEY hNetCard = NULL;
m_TotalNetCards = GetMacAddress(m_MacAddr);

lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"),0,KEY_READ,&hNetCard);
if(lRtn != ERROR_SUCCESS)//此处失败就返回
{
if(hNetCard != NULL)
::RegCloseKey(hNetCard);
return FALSE;
}

DWORD dwSubKeyNum = 0,dwSubKeyLen = 256;
//得到子键的个数,通常与网卡个数相等
lRtn = ::RegQueryInfoKey(hNetCard,NULL,NULL,NULL,&dwSubKeyNum,&dwSubKeyLen,
NULL,NULL,NULL,NULL,NULL,NULL);
if(lRtn == ERROR_SUCCESS)
{
m_TotalNetCards = dwSubKeyNum;//网卡个数以此为主
LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
DWORD dwSize;
for(int i = 0; i < (int)dwSubKeyNum; i++)
{
TCHAR szServiceName[256];
HKEY hNewKey;
DWORD dwType = REG_SZ,dwDataSize = 256;
dwSize = dwSubKeyLen + 1;
::RegEnumKeyEx(hNetCard,i,lpszKeyName,&dwSize,NULL,NULL,NULL,NULL);
lRtn = ::RegOpenKeyEx(hNetCard,lpszKeyName,0,KEY_READ,&hNewKey);
if(lRtn == ERROR_SUCCESS)
{
lRtn = ::RegQueryValueEx(hNewKey,_T("Description"),NULL,&dwType,(LPBYTE)m_Cards[i].szDescription,&dwDataSize);
dwDataSize = 256;
lRtn = ::RegQueryValueEx(hNewKey,_T("ServiceName"),NULL,&dwType,(LPBYTE)szServiceName,&dwDataSize);
if(lRtn == ERROR_SUCCESS)
{
TCHAR szNewKey[256];
wsprintf(szNewKey,_T("%s\\Interfaces\\%s"),szParameters,szServiceName);
HKEY hTcpKey;
lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,szNewKey,0,KEY_READ,&hTcpKey);
if(lRtn == ERROR_SUCCESS)
{
dwDataSize = 256;
::RegQueryValueEx(hTcpKey,_T("DefaultGateway"),NULL,&dwType,(LPBYTE)m_Cards[i].szGateWay,&dwDataSize);
ProcessMultiString(m_Cards[i].szGateWay,dwDataSize);
dwDataSize = 256;
::RegQueryValueEx(hTcpKey,_T("IPAddress"),NULL,&dwType,(LPBYTE)m_Cards[i].szIpAddress,&dwDataSize);
ProcessMultiString(m_Cards[i].szIpAddress,dwDataSize);
dwDataSize = 256;
::RegQueryValueEx(hTcpKey,_T("SubnetMask"),NULL,&dwType,(LPBYTE)m_Cards[i].szIpMask,&dwDataSize);
ProcessMultiString(m_Cards[i].szIpMask,dwDataSize);
dwDataSize = 256;
::RegQueryValueEx(hTcpKey,_T("NameServer"),NULL,&dwType,(LPBYTE)m_Cards[i].szDNSNameServer,&dwDataSize);
}
::RegCloseKey(hTcpKey);
}
}
::RegCloseKey(hNewKey);
m_Cards[i].szMacAddr[0] = m_MacAddr[i].b1;
m_Cards[i].szMacAddr[1] = m_MacAddr[i].b2;
m_Cards[i].szMacAddr[2] = m_MacAddr[i].b3;
m_Cards[i].szMacAddr[3] = m_MacAddr[i].b4;
m_Cards[i].szMacAddr[4] = m_MacAddr[i].b5;
m_Cards[i].szMacAddr[5] = m_MacAddr[i].b6;
}
delete[] lpszKeyName;
}
::RegCloseKey(hNetCard);
return lRtn == ERROR_SUCCESS ? TRUE : FALSE;
}



「已注销」 2005-02-23
  • 打赏
  • 举报
回复
用WINPCAP来做
Dong 2005-02-20
  • 打赏
  • 举报
回复
ping()可以吗?我记得在linux下是有这个函数的
要不
system("ping 127.0.0.1 > te.txt");
然后查看te.txt的内容!

关注……
大熊猫侯佩 2005-02-20
  • 打赏
  • 举报
回复
注册表

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧