VC如何判断无线网卡还是普通网卡(依据注册表的信息)

江左梅郎1 2009-07-20 02:44:57
如题

小弟正在做一个更改本地连接 即普通网卡的ip的小程序,中途遇到点问题是。

我遍历注册表,会得到两个网络适配器(一个普通网卡,一个无线,如果是笔记本的话);因为这个程序最后的面向用户

是我们公司的一群低智商的人们,所以,有没有方法直接获得普通网卡,不活的笔记本的。
...全文
1070 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tersng 2011-01-21
  • 打赏
  • 举报
回复
问题1.
在Vista or Windows 7 下Type 71 就是无线网卡。
  • 打赏
  • 举报
回复
楼主参考一下这里《GetAdaptersInfo怎么样区分无线网卡?》:http://www.qqgb.com/Program/VC/VCsystem/Program_261827.html
这里提出了4个问题:
问题1:
GetAdaptersInfo函数运行后的到得IP_ADAPTER_INFO结构体中Type项能否区分无线网卡?

问题2:
如果不能,VC6中有什么好的函数来辨别无线网卡和普通网卡?

问题3:
这个问题比较糟糕,因为在下没用过无线网卡这东西。无线网卡的路由器密钥能够将网络连接限制到什么程度?是连网关都ping不通?

问题4:
如果现在无线网卡已经连通并且程序已经能够辨识,如何用程序来检验无线网卡是否取得无线路由的密钥?


后来作者针对上面4个问题一一做了解答:
问题1.
Type项都是该死的6,真糟糕。

问题2.
直接用函数来辨别至今未发现,我采用了dream238的建议,从注册表查询键值。不过dream238兄记错了,wifi值出现在LowerRange中,而且是添加在其他值的后面,反而UpperRange是不变的,呵呵。但是不知道各种类型的网卡是否相同,这个问题就交给公司的测试部了,哈哈。

问题3.
公司没有给我无线路由的密钥,我的连接根本就是一个大红叉。不知道这项会不会有其他变化,我不管了。

问题4.
我采用了wangk兄的建议,查阅了一下Wlanapi.dll,通过这个库调用WlanEnumInterfaces等Wlan系列函数来检测状态,不过只要有信号能检测到并且有通讯就是connected,不太好用,结合ping网关的方式还好一点。

希望能对你有所帮助,谢谢!
danxuezx 2009-07-20
  • 打赏
  • 举报
回复
bool GetAdapterType ( const TCHAR *pAdapterName ,int &nCardType ) 
{
#define NET_CARD_KEY _T("System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}")

BOOL ret_value = FALSE;
TCHAR szDataBuf[MAX_PATH+1];
DWORD dwDataLen = MAX_PATH;
DWORD dwType = REG_SZ;
HKEY hNetKey = NULL;
HKEY hLocalNet = NULL;

if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,NET_CARD_KEY, 0, KEY_READ, &hNetKey))
return FALSE;
wsprintf(szDataBuf,_T("%s\\Connection"), pAdapterName);
if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
{
RegCloseKey(hNetKey);
return FALSE;
}
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, _T("MediaSubType"), 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
{
goto ret;
}

nCardType = *((DWORD *)szDataBuf);
ret:
RegCloseKey(hLocalNet);
RegCloseKey(hNetKey);

return ret_value;
}

这个代码是我修改后的。
Mingci_c 2009-07-20
  • 打赏
  • 举报
回复
帮顶~
chenzhp 2009-07-20
  • 打赏
  • 举报
回复
要读注册表的值,比如   
try
{
#define DEFAULT_BUFFER_SIZE 40960L

Interfaces.RemoveAll();
unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE);
DWORD type;
DWORD size = DEFAULT_BUFFER_SIZE;
DWORD ret;

char s_key[4096];
sprintf( s_key , "%d" , 510 );

while((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, s_key, 0, &type, data, &size)) != ERROR_SUCCESS) {
while(ret == ERROR_MORE_DATA)
{
size += DEFAULT_BUFFER_SIZE;
data = (unsigned char*) realloc(data, size);
}
if(ret != ERROR_SUCCESS)
{
return FALSE;
}
}

PERF_DATA_BLOCK *dataBlockPtr = (PERF_DATA_BLOCK *)data;
PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr);

for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++)
{
char nameBuffer[255];
if(objectPtr->ObjectNameTitleIndex == 510)
{
DWORD processIdOffset = ULONG_MAX;
PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);

for(int b=0 ; b<(int)objectPtr->NumCounters ; b++)
{
if(counterPtr->CounterNameTitleIndex == 520)
processIdOffset = counterPtr->CounterOffset;

counterPtr = NextCounter(counterPtr);
}

if(processIdOffset == ULONG_MAX) {
free(data);
return 1;
}

PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr);

for(b=0 ; b<objectPtr->NumInstances ; b++)
{
wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);
PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr);
char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer));
if( strcmp(pName, "") == 0 ) continue;

DWORD bandwith = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));
DWORD tottraff = 0;

Interfaces.AddTail(CString(pName));
Bandwidths.AddTail(bandwith);
TotalTraffics.AddTail(tottraff); // initial 0, just for creating the list

instancePtr = NextInstance(instancePtr);
}
}
objectPtr = NextObject(objectPtr);
}
free(data);

return TRUE;
}
catch(...)
{
return FALSE;
}
大前置 2009-07-20
  • 打赏
  • 举报
回复
帮顶~~

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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