为什么我找不到所有网卡了?

fbiboss001 2005-10-26 12:10:46
以下是按网上写的,可是为什么只能找到一个网卡了,找到的还不是我使用的那块,

WCHAR AdapterName[2048];
ULONG adapter_length=2048;
PacketGetAdapterNames((char*)AdapterName, &adapter_length);
static char AdapterList[2048][1024];


WCHAR *temp,*temp1;
temp = AdapterName;
temp1 = AdapterName;
int i = 0;
while ((*temp != '\0')||(*(temp-1) != '\0'))
{
if (*temp == '\0')
{
memcpy(AdapterList[i],temp1,(temp-temp1)*2);
temp1 = temp+1;
i++;
}

temp++;
}

int AdapterNum = i;
for (i = 0; i < AdapterNum; i++)
{wprintf(L"\n%d- %s\n", i+1, AdapterList[i]);
MessageBox(AdapterList[i]);
}
...全文
1087 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifengice0706 2005-11-01
  • 打赏
  • 举报
回复
typedef struct tagAdapterInfo
{
string strName; // 适配器名称
string strDriverDesc; // 适配器描述
string strIP; // IP地址
string strNetMask; // 子网掩码
string strNetGate; // 网关
}ADAPTER_INFO;

BOOL GetAdapterInfo();
vector<ADAPTER_INFO*> AdapterInfoVector;
BOOL RegGetIP(ADAPTER_INFO *pAI, LPCTSTR lpszAdapterName, int nIndex/* =0 */);

BOOL GetAdapterInfo()
{
// 这里的代码适合WINDOWS2000,对于NT需要读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
HKEY hKey, hSubKey, hNdiIntKey;

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"System\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}",
0,
KEY_READ,
&hKey) != ERROR_SUCCESS)
return FALSE;

DWORD dwIndex = 0;
DWORD dwBufSize = 256;
DWORD dwDataType;
char szSubKey[256];
unsigned char szData[256];

while(RegEnumKeyEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
{
if(RegOpenKeyEx(hSubKey, "Ndi\\Interfaces", 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)
{
dwBufSize = 256;
if(RegQueryValueEx(hNdiIntKey, "LowerRange", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
{
if(strcmp((char*)szData, "ethernet") == 0) // 判断是不是以太网卡
{
dwBufSize = 256;
if(RegQueryValueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
{
ADAPTER_INFO *pAI = new ADAPTER_INFO;
pAI->strDriverDesc = (LPCTSTR)szData;
dwBufSize = 256;
if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
{
pAI->strName = (LPCTSTR)szData;
RegGetIP(pAI, (LPCTSTR)szData);
}
AdapterInfoVector.push_back(pAI); // 加入到容器中
}
}
}
RegCloseKey(hNdiIntKey);
}
RegCloseKey(hSubKey);
}

dwBufSize = 256;
} /* end of while */

RegCloseKey(hKey);

return TRUE;
}


BOOL RegGetIP(ADAPTER_INFO *pAI, LPCTSTR lpszAdapterName, int nIndex/* =0 */)
{
ASSERT(pAI);

HKEY hKey;
string strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
strKeyName += lpszAdapterName;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
strKeyName.c_str(),
0,
KEY_READ,
&hKey) != ERROR_SUCCESS)
return FALSE;

unsigned char szData[256];
DWORD dwDataType, dwBufSize;

dwBufSize = 256;
if(RegQueryValueEx(hKey, "IPAddress", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
pAI->strIP = (LPCTSTR)szData;

dwBufSize = 256;
if(RegQueryValueEx(hKey, "SubnetMask", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
pAI->strNetMask = (LPCTSTR)szData;

dwBufSize = 256;
if(RegQueryValueEx(hKey, "DefaultGateway", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)
pAI->strNetGate = (LPCTSTR)szData;

RegCloseKey(hKey);
return TRUE;
}

还有一种方式得到网卡描述,但其显示的名称不是很具体

ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
{
delete pAdapterInfo;
pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
pAdapterInfoBkp = pAdapterInfo;
}
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
{
do {
if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
{
ADAPTER_INFO *pAI = new ADAPTER_INFO;
pAI->strDriverDesc = pAdapterInfo->Description;
pAI->strName = pAdapterInfo->AdapterName;
RegGetIP(pAI, (LPCTSTR)pAdapterInfo->AdapterName); // 因为IP_ADAPTER_INFO中未包含掩码信息,所以干脆直接读注册表
AdapterInfoVector.push_back(pAI);
}
pAdapterInfo = pAdapterInfo->Next;
} while(pAdapterInfo);
}
delete pAdapterInfoBkp;


GetAdaptersInfo这个函数要装sdk的,在Iphlpapi.h和Iphlpapi.lib中。
希望你的问题解决了。
lifengice0706 2005-10-31
  • 打赏
  • 举报
回复
明早见此贴,帖代码给你 :)
fbiboss001 2005-10-31
  • 打赏
  • 举报
回复
谢谢啊,我得知道网卡的名字才能知道对应的\device\,才能知道打开哪个啊?
注册表我找不到啊,搜索也找不到
lifengice0706 2005-10-27
  • 打赏
  • 举报
回复
CHAR AdapterName[8192];
memset(AdapterName,0,8192);
CHAR *temp;

int AdapterNum = 0;

char AdapterList[10][1024];
memset(AdapterList,0,10*1024);

DWORD AdapterLength=4096;

int i=0;

PacketGetAdapterNames((PTSTR)AdapterName,&AdapterLength);
temp=AdapterName;

int Len = strlen(AdapterName);
int Pos = 0;
while(Len)
{
memcpy(AdapterList[Pos],temp,Len);
temp+=Len+1;
Len = strlen(temp);
Pos++;
i++;
}
// 显示适配器列表
AdapterNum=i;
for (i=0;i<AdapterNum;i++)
{
CString strAdapter = AdapterList[i];
m_adapt.AddString(strAdapter);
wprintf(L"\n%d- %s\n",i+1,AdapterList);
}

不过这种方式得到的是在wincap下用的所谓device。如果想得到网卡的描述,还是用传统的读注册表的方法为好。
代码未经验证,可以看出思路而已。
lifengice0706 2005-10-27
  • 打赏
  • 举报
回复
如果我没记错的话你说的很对,可他就是为以后在wincap中的使用才改为\device\输出的,在源码中可以看到的,你还是读注册表吧,如果你还没解决,我明早再做一次好人,贴代码给你。
fbiboss001 2005-10-27
  • 打赏
  • 举报
回复
PacketGetAdapterNames里面有网卡名字了,不知道怎么读出了?
lifengice0706 2005-10-27
  • 打赏
  • 举报
回复
那是对网卡的唯一标识,在注册表里有网卡的名字的,再找找看吧。我记不得是哪一项了!
fbiboss001 2005-10-27
  • 打赏
  • 举报
回复
谢谢,可以正确的得到网卡了,得到的是\device\..这样的,我在注册表中找也是找到这样的字串,找不到网卡的名字啊??
吹泡泡的小猫 2005-10-26
  • 打赏
  • 举报
回复
wincap不是有枚举网络适配卡的例子吗?看看例子就好了
rabo 2005-10-26
  • 打赏
  • 举报
回复
请拨打110,下次记得给网卡买个保险。
fbiboss001 2005-10-26
  • 打赏
  • 举报
回复
谢谢了啊,我也是在网上找的,找出很多相同的,只是变量名不同的,但是我是菜鸟的,不会改啊,您能帮我的话真是谢谢您了.
周江涛 2005-10-26
  • 打赏
  • 举报
回复
打开机箱看一下,有网卡在没:)
lifengice0706 2005-10-26
  • 打赏
  • 举报
回复
这段代码见了好几次了,在处理宽字符时,有问题,并不是你没取出来,而是在解开时发生了错误,搂主先自己看吧,如果不行在后面跟帖,我会帮你改的!
fbiboss001 2005-10-26
  • 打赏
  • 举报
回复
在哪了,我找不到啊?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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