如何枚举所有的网卡(像本地连接一样,包括禁用的) UP UP UP ! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 曾在做wifi热点共享时候用到,但是觉得这样操作,后面共享的实现不灵活,另外想办法了。以下提供枚举#include <NetCon.h> #include <locale> #pragma comment(lib,"Iphlpapi.lib") #pragma comment(lib,"Rpcrt4.lib")//GUID //启用、禁用网卡#pragma comment(lib,"ole32.lib")//CoCreateInstance函数需要//2.声明相关的变量和赋初值,以下代码直接可以复制到main函数里面 INetConnectionManager *pManager=NULL; INetConnection *pConnection=NULL; IEnumNetConnection *pEnum=NULL; ULONG celt; INetSharingManager *pNetSharingManager=NULL; INetConnectionProps *pProps=NULL; INetSharingConfiguration *pConfiguration=NULL; NETCON_PROPERTIES* Nproperties=NULL;//3. CoInitialize(NULL);//初始化COM库//扩展知识:用来告诉 Windows以单线程的方式创建com对象,CoInitialize和CoUninitialize必须成对使用。CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pManager);//创建一个com对象//CLSID_ConnectionManager是创建的Com对象的类标识符(CLSID) //IID_INetConnectionManager是创建的Com对象的接口标识符//最后一个参数是用来接收指向Com对象接口地址的指针变量//4.前面的都准备后了,接下来就是实现的代码了。//先做一下是否成功创建了com对象 if(pManager == NULL) { printf("产生异常,创建失败,Error:%d\n",GetLastError()); return 0; } //接下来先看看一个函数的解释:/* virtual HRESULT STDMETHODCALLTYPE EnumConnections( [in] NETCONMGR_ENUM_FLAGS Flags, [out] __RPC__deref_out_opt IEnumNetConnection **ppEnum)其中: 第一个参数可以有以下的参数选择、 NCME_DEFAULT = 0, NCME_HIDDEN = 0x1*/ pManager->EnumConnections(NCME_DEFAULT, &pEnum);//开始枚举网卡 while( pEnum->Next(1, &pConnection, &celt) == S_OK ) { /*条件会返回2个值,分别是S_OK,S_FALSE #define S_OK ((HRESULT)0L) #define S_FALSE ((HRESULT)1L) */ pConnection->GetProperties(&NNproperties); if(NNproperties->Status == NCS_CONNECTED)//查询连接状态的网卡 { wprintf(L"%s\n",Nproperties->pszwDeviceName);//pszwDeviceName储存着网卡的驱动名字 } if(NNproperties->Status == NCS_DISCONNECTING)//查询断开连接状态的网卡 { wprintf(L"%s\n",Nproperties->pszwDeviceName); } /* 其中状态值有下面的值: NCS_DISCONNECTED = 0, NCS_CONNECTING = ( NCS_DISCONNECTED + 1 ) , NCS_CONNECTED = ( NCS_CONNECTING + 1 ) , NCS_DISCONNECTING = ( NCS_CONNECTED + 1 ) , NCS_HARDWARE_NOT_PRESENT = ( NCS_DISCONNECTING + 1 ) , NCS_HARDWARE_DISABLED = ( NCS_HARDWARE_NOT_PRESENT + 1 ) , NCS_HARDWARE_MALFUNCTION = ( NCS_HARDWARE_DISABLED + 1 ) , NCS_MEDIA_DISCONNECTED = ( NCS_HARDWARE_MALFUNCTION + 1 ) , NCS_AUTHENTICATING = ( NCS_MEDIA_DISCONNECTED + 1 ) , NCS_AUTHENTICATION_SUCCEEDED = ( NCS_AUTHENTICATING + 1 ) , NCS_AUTHENTICATION_FAILED = ( NCS_AUTHENTICATION_SUCCEEDED + 1 ) , NCS_INVALID_ADDRESS = ( NCS_AUTHENTICATION_FAILED + 1 ) , NCS_CREDENTIALS_REQUIRED = ( NCS_INVALID_ADDRESS + 1 ) NETCON_STATUS; */ }//最后就是结束程序后的工作了,如果写在了一个类里面,直接可以把下面的代码放在斥构函数里面 if(pManager) pManager->Release(); if(pConnection) pConnection->Release(); if(pEnum) pEnum->Release(); if(pNetSharingManager) pNetSharingManager->Release(); if(pConfiguration) pConfiguration->Release(); CoUninitialize();//记得添加 //调用GetAdaptersInfo查询多个网卡信息 if(GetAdaptersInfo(info, &ulOutBufLen) == ERROR_NO_DATA) { MessageBox(_T("已禁用")); } else { MessageBox(_T("已连接")); } 我插的是USB无线网卡, 获取到的类型却是Ethernet 802.3 谢谢,你这种方法可行。现在还有一个问题,我如何获取windows任务栏中的网络状态图标显示(红叉,感叹号)? 啊。好不容易搜到了这个帖子。但是我试了一下bojie5744的代码,并断开了以太网的网络连接, if(NNproperties->Status == NCS_DISCONNECTING)//查询断开连接状态的网卡 { wprintf(L"%s\n",Nproperties->pszwDeviceName); //这行代码根本就进不来。。怎么办啊?? }求bojie5744大神快快出现!!!! oledb问题 关于对话框ID的问题,编译时提示未定义,不解 编译通过,可是运行的时候报错,求助下 关于霍夫曼压缩存储时的问题 最简单的http过程是怎样的?欢迎大家讨论 关于视频显示,在线! 求助 请告诉我一个下载vc技术内幕(中文版)的连接 请教高手:DLL里封装无模式对话框? OA CPropertySheet的问题 MFC 数据删除
以下提供枚举
#include <NetCon.h>
#include <locale>
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"Rpcrt4.lib")//GUID
//启用、禁用网卡
#pragma comment(lib,"ole32.lib")//CoCreateInstance函数需要//2.声明相关的变量和赋初值,以下代码直接可以复制到main函数里面
INetConnectionManager *pManager=NULL;
INetConnection *pConnection=NULL;
IEnumNetConnection *pEnum=NULL;
ULONG celt;
INetSharingManager *pNetSharingManager=NULL;
INetConnectionProps *pProps=NULL;
INetSharingConfiguration *pConfiguration=NULL;
NETCON_PROPERTIES* Nproperties=NULL;//3.
CoInitialize(NULL);//初始化COM库
//扩展知识:用来告诉 Windows以单线程的方式创建com对象,CoInitialize和CoUninitialize必须成对使用。
CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pManager);//创建一个com对象
//CLSID_ConnectionManager是创建的Com对象的类标识符(CLSID)
//IID_INetConnectionManager是创建的Com对象的接口标识符
//最后一个参数是用来接收指向Com对象接口地址的指针变量//4.前面的都准备后了,接下来就是实现的代码了。
//先做一下是否成功创建了com对象
if(pManager == NULL)
{
printf("产生异常,创建失败,Error:%d\n",GetLastError());
return 0;
}
//接下来先看看一个函数的解释:
/*
virtual HRESULT STDMETHODCALLTYPE EnumConnections(
[in] NETCONMGR_ENUM_FLAGS Flags,
[out] __RPC__deref_out_opt IEnumNetConnection **ppEnum)
其中: 第一个参数可以有以下的参数选择、
NCME_DEFAULT = 0,
NCME_HIDDEN = 0x1*/
pManager->EnumConnections(NCME_DEFAULT, &pEnum);//开始枚举网卡 while( pEnum->Next(1, &pConnection, &celt) == S_OK )
{
/*
条件会返回2个值,分别是S_OK,S_FALSE
#define S_OK ((HRESULT)0L)
#define S_FALSE ((HRESULT)1L)
*/ pConnection->GetProperties(&NNproperties);
if(NNproperties->Status == NCS_CONNECTED)//查询连接状态的网卡
{
wprintf(L"%s\n",Nproperties->pszwDeviceName);//pszwDeviceName储存着网卡的驱动名字
}
if(NNproperties->Status == NCS_DISCONNECTING)//查询断开连接状态的网卡
{
wprintf(L"%s\n",Nproperties->pszwDeviceName);
}
/*
其中状态值有下面的值:
NCS_DISCONNECTED = 0,
NCS_CONNECTING = ( NCS_DISCONNECTED + 1 ) ,
NCS_CONNECTED = ( NCS_CONNECTING + 1 ) ,
NCS_DISCONNECTING = ( NCS_CONNECTED + 1 ) ,
NCS_HARDWARE_NOT_PRESENT = ( NCS_DISCONNECTING + 1 ) ,
NCS_HARDWARE_DISABLED = ( NCS_HARDWARE_NOT_PRESENT + 1 ) ,
NCS_HARDWARE_MALFUNCTION = ( NCS_HARDWARE_DISABLED + 1 ) ,
NCS_MEDIA_DISCONNECTED = ( NCS_HARDWARE_MALFUNCTION + 1 ) ,
NCS_AUTHENTICATING = ( NCS_MEDIA_DISCONNECTED + 1 ) ,
NCS_AUTHENTICATION_SUCCEEDED = ( NCS_AUTHENTICATING + 1 ) ,
NCS_AUTHENTICATION_FAILED = ( NCS_AUTHENTICATION_SUCCEEDED + 1 ) ,
NCS_INVALID_ADDRESS = ( NCS_AUTHENTICATION_FAILED + 1 ) ,
NCS_CREDENTIALS_REQUIRED = ( NCS_INVALID_ADDRESS + 1 )
NETCON_STATUS;
*/
}//最后就是结束程序后的工作了,如果写在了一个类里面,直接可以把下面的代码放在斥构函数里面
if(pManager) pManager->Release();
if(pConnection) pConnection->Release();
if(pEnum) pEnum->Release();
if(pNetSharingManager) pNetSharingManager->Release();
if(pConfiguration) pConfiguration->Release();
CoUninitialize();//记得添加
if(GetAdaptersInfo(info, &ulOutBufLen) == ERROR_NO_DATA)
{
MessageBox(_T("已禁用"));
}
else
{
MessageBox(_T("已连接"));
}
我插的是USB无线网卡, 获取到的类型却是Ethernet 802.3
{
wprintf(L"%s\n",Nproperties->pszwDeviceName); //这行代码根本就进不来。。怎么办啊??
}求bojie5744大神快快出现!!!!