最近在玩树莓派,烧录的也是win10  IOT 系统,然后想弄一个界面可以手动设置wifi热点,所以找了找windows的wlanAPI.

然后发现网上很多关于 保存了密码的无线网络 的连接方法,如:http://blog.csdn.net/lincyang/article/details/34430939这位仁兄的文章,
但是如何设置热点的几乎没有!

所以只能自己弄,麻烦的要命,其实在电脑上是不需要这么麻烦的用代码来实现的,直接用dos命令就能搞定,这只是个人的爱好和需要。dos命令就不介绍了百度一大堆!

#include <windows.h>
#include <wlanapi.h>
#include <objbase.h>
#include <wtypes.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
// Need to link with Wlanapi.lib and Ole32.lib
#pragma comment(lib, "wlanapi.lib")
#pragma comment(lib, "ole32.lib")
#include <atlconv.h>#include <iostream>
using namespace std;#include <atlstr.h>#include <netcon.h>
#include <NetCon.h>
#include <locale.h>
#include <WinNetWk.h>
#include <netlistmgr.h>
#include <ShObjIdl.h>
#pragma comment (lib,"Mpr.lib")
#pragma comment(lib, "oleaut32.lib")// 设置internet 连接共享(ICS)
HRESULT AddSharingNet( INetSharingManager* pNSM )
{INetConnection * pNC = NULL; INetSharingEveryConnectionCollection * pNSECC = NULL;
// 枚举设备(即本地连接,无线网络连接。。。)
HRESULT hr = pNSM->get_EnumEveryConnection( &pNSECC );
if (!pNSECC)
{
wprintf( L"failed to get EveryConnectionCollection!\r\n" );
}
else // 反之获取 枚举列表成功
{
IEnumVARIANT * pEV = NULL;
IUnknown * pUnk = NULL;
hr = pNSECC->get__NewEnum( &pUnk );
if (pUnk)
{
hr = pUnk->QueryInterface( __uuidof(IEnumVARIANT), (void**)&pEV );
pUnk->Release( );
}if (pEV)
{
VARIANT v;
VariantInit( &v );// 初始化 错误 类型VARIANT(是错误可捕捉)
BOOL bFoundIt = FALSE;
INetSharingConfiguration * pNSC = NULL;
INetSharingConfiguration * pVWifiNSC = NULL;
NETCON_PROPERTIES* pVWifi = NULL;
while (S_OK == pEV->Next( 1, &v, NULL ))// 枚举序列中的元素 ,返回错误值
{
if (V_VT( &v ) == VT_UNKNOWN)// 返回位置类型
{
V_UNKNOWN( &v )->QueryInterface( __uuidof(INetConnection), (void**)&pNC );  // 查询设备是否支持接口
if (pNC)
{
NETCON_PROPERTIES* pNP = NULL;
pNC->GetProperties( &pNP );// 获取设备属性
setlocale( LC_ALL, "chs" );
wprintf( L"pszwName--%s\n", pNP->pszwName );
wprintf( L"pszwDeviceName--%s\n", pNP->pszwDeviceName );
wprintf( L"Status--%d\n", pNP->Status );// 这个值是表示网络是否禁用
wprintf( L"MediaType--%d\n", pNP->MediaType );
wprintf( L"dwCharacter--%d\n", pNP->dwCharacter );
wprintf( L"clsidThisObject--%d\n", pNP->clsidThisObject );
wprintf( L"clsidUiObject--%d\n", pNP->clsidUiObject );
wprintf( L"\n" );//  被共享的网络设置为公开共享
USES_CONVERSION;
std::string  str( W2A( pNP->pszwDeviceName ) );
/* 这里我是为了开一个虚拟的网络(一般电脑上都会有本地连接,无线网络这两个,而我需要设置wifi热点, 即承载网络)*/
if (pNP->Status == NCS_CONNECTED && (- 1 == str.find( "Virtual" )))
{
hr = pNSM->get_INetSharingConfigurationForINetConnection( pNC, &pNSC );
hr = pNSC->EnableSharing( ICSSHARINGTYPE_PUBLIC );
pNSC->Release( );
}/* 虚拟无线网络设置(本地网络或者是无线网络都可以,前提是这个网络需要是能连接上外网的,上面那个就是共享的它的外网)*/
if (pNP->Status == NCS_CONNECTED && (-1 != str.find( "Virtual" )))
{
pVWifi = pNP;
hr = pNSM->get_INetSharingConfigurationForINetConnection( pNC, &pVWifiNSC );
pVWifiNSC->EnableSharing( ICSSHARINGTYPE_PRIVATE );
wprintf( L"\nIs this VWifi?--%s\n\n", pVWifi->pszwDeviceName );
}
}
}
}
// 因设计需要 必须要有一个 虚拟的网络  如果没有那么这个指针为空
if (pVWifiNSC == NULL )
{
cout << "pVWifiNSC NULL" << endl;
return -1;
}INetSharingPortMapping * pNSPM = NULL;
BSTR pszwName = pVWifi->pszwName;
wprintf( L"BSTR--------------%s\n", pszwName );    // 被设置的虚拟网络
pVWifiNSC->Release( );
if (pNSPM)
{
wprintf( L"just added ........................................................!\r\n" );
hr = pNSPM->Enable( );
wprintf( L"just enabled port mapping!\r\n" );INetSharingPortMappingProps* pMapping = NULL;
pNSPM->get_Properties( &pMapping );
BSTR result = NULL;
long port = 0;
pMapping->get_Name( &result );
pMapping->get_ExternalPort( &port );
wprintf( L"NAMEEEEE::::%s\n", result );
wprintf( L"exPortttttt::::%d\n", port );
pNSPM->Release( );
}
}
}return hr;
}int main( )
{CoInitialize( NULL );
CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );INetSharingManager * pNSM = NULL;
HRESULT hr = ::CoCreateInstance( __uuidof(NetSharingManager), NULL, CLSCTX_ALL,
__uuidof(INetSharingManager), (void**)&pNSM );if (!pNSM)
{
wprintf( L"failed to create NetSharingManager object\r\n" );
}
// 添加共享功能
AddSharingNet( pNSM );DWORD dError = 0;
DWORD dwServiceVersion = 0;
HANDLE hClient = NULL;
if (ERROR_SUCCESS != (dError = WlanOpenHandle(
WLAN_API_VERSION,
NULL,
&dwServiceVersion,
&hClient
)))
{
cout << "WlanOpenHandle ret dwError = " << dError << endl;
return -1;
}
// check service version
if (WLAN_API_VERSION_MAJOR( dwServiceVersion ) < WLAN_API_VERSION_MAJOR( WLAN_API_VERSION_2_0 ))
{
cout << "WlanCloseHandle " << endl;
WlanCloseHandle( hClient, NULL );
}// 设置承载网络模式为允许
BOOL bIsAllow = TRUE;
WLAN_HOSTED_NETWORK_REASON dwFailedReason;
DWORD dwReturnValue = WlanHostedNetworkSetProperty( hClient,
wlan_hosted_network_opcode_enable,
sizeof( BOOL ),
&bIsAllow,
&dwFailedReason,
NULL );
if (ERROR_SUCCESS != dwReturnValue)
{cout << "WlanHostedNetworkSetProperty  ret dwReturnValue" << dwReturnValue <<endl;
return -1;
}// dwReturnValue = WlanHostedNetworkStopUsing( hClient, &dwFailedReason, NULL );// 设置承载网络的SSID和最大连接数
WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS wlanConnectionSetting;
memset( &wlanConnectionSetting, 0, sizeof( WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS ) );string strSSIDInsert;
cout << "设置热点名称:";
cin >> strSSIDInsert;
//CString strSSID = _T("chenzhen3");
CString strSSID( strSSIDInsert.c_str( ) );// WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS中的SSID字段必须为ANSI类型,因此如果程序使用的是Unicode,则需要做转换。
#ifdef _UNICODE
WideCharToMultiByte( CP_ACP,
0,
strSSID.GetBuffer( 0 ),   // 保存SSID的CString类型
strSSID.GetLength( ),    // SSID字符串的长度
(LPSTR)wlanConnectionSetting.hostedNetworkSSID.ucSSID,
32,
NULL,
NULL );
#else
memcpy(wlanConnectionSetting.hostedNetworkSSID.ucSSID, strSSID.GetBuffer(0), strlen(strSSID.GetBuffer(0)));
#endif
wlanConnectionSetting.hostedNetworkSSID.uSSIDLength = strlen( (const char*)wlanConnectionSetting.hostedNetworkSSID.ucSSID );
wlanConnectionSetting.dwMaxNumberOfPeers = 100;
dwReturnValue = WlanHostedNetworkSetProperty( hClient,
wlan_hosted_network_opcode_connection_settings,
sizeof( WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS ),
&wlanConnectionSetting,
&dwFailedReason,
NULL );
if (ERROR_SUCCESS != dwReturnValue)
{
cout << "WlanHostedNetworkSetProperty ret " << dwReturnValue << endl;
return -1;
}string strPass("");
cout << "设置热点密码:";
cin >> strPass;
//CString strSecondaryKey = _T( "12345678" );
CString strSecondaryKey( strPass.c_str( ) );UCHAR keyBuf[100] = { 0 };
#ifdef _UNICODE
WideCharToMultiByte( CP_ACP,
0,
strSecondaryKey.GetBuffer( 0 ),
strSecondaryKey.GetLength( ),
(LPSTR)keyBuf,
100,
NULL,
NULL );
#else
memcpy( keyBuf, strSecondaryKey.GetBuffer( 0 ), strlen( strSecondaryKey.GetBuffer( 0 ) ) );
#endif
// 设置密码
PVOID  pvReserved = NULL;
dwReturnValue = WlanHostedNetworkSetSecondaryKey( hClient,
strlen( (const char*)keyBuf ) + 1,
keyBuf,
TRUE,
FALSE,
&dwFailedReason,
pvReserved );
if (ERROR_SUCCESS != dwReturnValue)
{
if ( ERROR_INVALID_PARAMETER == dwReturnValue )
{
if (hClient == NULL)
{
cout << "hClient == NULL" << endl;
}
if ( keyBuf == NULL )
{
cout << "keyBuf == NULL" << endl;
}
if (pvReserved != NULL)
{
cout << "pvReserved != NULL" << endl;
}
cout << dwReturnValue << "---"<< ERROR_INVALID_PARAMETER << endl;
}
return -1;
}
// 启用承载网络设置
dwReturnValue = WlanHostedNetworkStartUsing( hClient, &dwFailedReason, NULL );
if (ERROR_SUCCESS != dwReturnValue)
{
if (wlan_hosted_network_reason_interface_unavailable == dwFailedReason)
{
cout << "无线承载网络禁用" << endl;
return 0;
}
cout << "未知失败" << endl;
return -1;
}
//  停止Soft AP
// dwReturnValue = WlanHostedNetworkStopUsing( hClient, &dwFailedReason, NULL );
// if (ERROR_SUCCESS != dwReturnValue)
// {
// if (ERROR_INVALID_HANDLE == dwReturnValue || ERROR_INVALID_PARAMETER == dwReturnValue ||
// ERROR_INVALID_STATE == dwReturnValue || ERROR_SERVICE_NOT_ACTIVE == dwReturnValue)
// {
// cout << dwReturnValue << endl;
// }
//
// cout << dwReturnValue << endl;
// return -1;
// }
// // 启用承载网络
dwReturnValue = WlanHostedNetworkForceStart( hClient, &dwFailedReason, NULL );
if (ERROR_SUCCESS != dwReturnValue)
{
cout << "ri" << endl;
return -1;
}system( "pause" );return 0;
}

要用的可以直接拷贝,可以编译直接使用,当然这是个demo,看着不舒服的自己改改哈!

另:https://msdn.microsoft.com/en-us/library/windows/desktop/dd439506(v=vs.85).aspx  微软官方API地址!

c++ WlanAPI 承载网络 连接无线网络相关推荐

  1. Win10切换网络连接为专用网络或者公用网络 有线网络连接无线网络连接 解决网络共享问题

    Win10切换网络连接为专用网络或者公用网络 有线网络连接无线网络连接 由于windows10在网络连接上面分为专用网络和公用网络,两台计算机之间通信共享需要在相同的网络下才能进行,所以有此设置. 但 ...

  2. 禁用计算机的网络连接无线网络连接不上,笔记本电脑无线网络连接不上是什么原因...

    笔记本电脑无线网络连接不上是什么原因?笔记本电脑连接不上无线网络的原因,有以下几种可能:1.无线网络密码不正确:2.无线网络缓存问题:3.路由器上进行了限制. 笔记本电脑无线网络连接不上 一.无线网络 ...

  3. 禁用计算机的网络连接无线网络连接,电脑设置了禁用网络,连接不上WIFI.怎么解除...

    电脑设置了禁用网络,连接不上WIFI.怎么解除 电脑禁用网络连接不上WIFI的解决方法如下: 1. 确认FN快捷键已经打开,确认FN快捷键驱动,电源管理软件和无线网卡驱动正常安装; 2. 确认是否开启 ...

  4. 启用计算机无线网络连接,无线网络连接未启用DHCP是怎么回事?如何解决?

    无线网络连接未启用DHCP是怎么回事?如何解决?其实这是由于你的电脑未设置自动获取IP和DNS的缘故,所以要想解决这个问题,设置好电脑自动获取IP即可,下面小编就为大家介绍其解决方法,一起来看看吧! ...

  5. 禁用计算机的网络连接无线网络连接不上,win7笔记本电脑无线网络连接不上怎么解决?...

    最近有不少网友都遇到了win7笔记本电脑无线网络连接不上的问题.我们都知道,无线网络是可以共享的,笔记本无线网络连接不上,我们就无法有进一步的操作了.那么,win7笔记本电脑无线网络连接不上怎么解决呢 ...

  6. 禁用计算机的网络连接无线网络连接不上,windows 7 无法连接无线网络,网络连接出现黄色感叹号,但其他设备连接无线网络正常...

    您好, 请问您的网络环境中是路由器作为无线热点的吗?黄色叹号表示网络受限或者驱动异常,建议您先查看无线网络服务和网线网卡驱动是否正常: 1.按Win+R,输入services.msc,按回车键,在服务 ...

  7. 笔记本计算机的连接无线网络连接,笔记本电脑连接wifi的方法步骤

    笔记本电脑怎么连接wifi?Wi-Fi是一种可以将个人电脑.手持设备(如pad.手机)等终端以无线方式互相连接的技术,事实上它是一个高频无线电信号.下面就由学习啦小编来给大家说说笔记本电脑怎么连接wi ...

  8. linux命令行模式连接网络,centos命令行模式连接无线网络的过程

    1. 首先, 你的系统要能驱动无限网卡, 要是人品好的话, 系统已经自带了你的网卡的驱动程序. 不然就要先搞定无线网卡的驱动再说. 不然后面的步骤也就没必要了. 2. 看一下你的无线网卡叫什么: iw ...

  9. 解决Debian 9 iwlwifi固件缺失导致无法连接无线网络的问题

    解决Debian 9 iwlwifi固件缺失导致无法连接无线网络的问题 参考文章: (1)解决Debian 9 iwlwifi固件缺失导致无法连接无线网络的问题 (2)https://www.cnbl ...

  10. Ubuntu安装后无法连接无线网络

    [问题] Ubuntu安装后无法连接无线网络,无线连接的指示灯显示无线关闭状态(我的无线连接指示灯红灯位关闭,蓝色为开启),但是有线网络正常可用. [原因] 无线上网的驱动Ubuntu的无线上网驱动尚 ...

最新文章

  1. Docker(十三):Docker 清理命令集锦
  2. HDU 1043 Eight(双向BFS+康托展开)
  3. 关于y7000安装Ubuntu的一些心得体会
  4. Strategy Pattern(策略模式)
  5. qemu核心机制分析-协程coroutine
  6. Win Form登录机制的实现
  7. 【es】Node与NodeEnvironment的实例化
  8. html禁止手机截屏,[置顶] Android 应用内禁止截屏功能的实现
  9. Wikioi 2822爱在心中(强连通缩点+dfs)
  10. Swift学习笔记十二
  11. VR 、AR 谁让你眼前一亮
  12. linux下载m3u8工具,m3u8命令行下载工具
  13. Hspice 反相器仿真
  14. 最简单的正版Win10重装系统教程
  15. 时间转换 Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)
  16. Civil 3D API二次开发学习指南
  17. 吴恩达深度学习笔记——优化算法
  18. 【原创】EXCEL数组公式(1)----数组公式和普通公式计算具体比较
  19. Excel 2010 SQL应用105 域聚合函数之第一个和最后一个
  20. 玩转NVIDIA Jetson AGX Xavier(3)--- 使用JetPack 4.1为Xavier刷机

热门文章

  1. 华为2022机试(餐厅排队提示系统)
  2. 205.164.48.243//index.php,完美解决php无法切片上传大文件方法
  3. Tomcat Manager App 指南
  4. 登录以及权限系统,用户认证信息存储设计思维
  5. python实现自动开机_Lambda,AWS和Python的自动化管理操作 - 自动开机和关机
  6. 手把手教你一键随机获取快手热门短视频的技巧
  7. sr550服务器系统,sr550服务器管理口地址
  8. Python批量下载精美短视频图片
  9. 服务器操作系统的安装流程图,服务器操作系统的安装流程图
  10. B站75万人围观:3天投了50份简历,没想到…