Dado que un PC puede tener varios interfaces Wifi y cada uno conectado a una red diferente, se trata de guardar el estado y conexión de cada para poder volver a realizar la conexión de cada interface con su red más tarde.
Que quede claro que este código no sirve para conectarse a una red a la que previamente no estabamos conectados, para ello os redirijo al tema Jugando con las conexiones Wifi
Aunque la pregunta se centraba en C++ Builder, me pareció interesante implementarlo también para delphi y compartir con vosotros este truco:
Este es el código para C/C++
cpp
// Desconecta o conecta las redes Wifi guardandolas al desconectar // Con hasta 10 adaptadores wifi en el PC #define MAX_Wifi_Interfaces 10 BOOL Wifi_Connect_DisConnect2(BOOL connect) { struct WLANConnected{ WCHAR strProfileName[256]; GUID InterfaceGuid; }; static WLANConnected Interfaces[MAX_Wifi_Interfaces] = {0}; HANDLE hClient; DWORD dwVersion; PWLAN_INTERFACE_INFO_LIST pInterfaceInfoList; PGUID pInterfaceGuid; PWLAN_CONNECTION_PARAMETERS pWLCP; PWLAN_AVAILABLE_NETWORK_LIST pNetworkList; BOOL Result = false; if(ERROR_SUCCESS == WlanOpenHandle(1, NULL, &dwVersion, &hClient)){ if(ERROR_SUCCESS == WlanEnumInterfaces(hClient, NULL, &pInterfaceInfoList)){ for(int i=0; i < pInterfaceInfoList->dwNumberOfItems && i < MAX_Wifi_Interfaces; i++){ pInterfaceGuid = &pInterfaceInfoList->InterfaceInfo[pInterfaceInfoList->dwIndex].InterfaceGuid; if(connect){ //if(pInterfaceInfoList->InterfaceInfo[pInterfaceInfoList->dwIndex].isState == wlan_interface_state_disconnected) for(int j=0; j<MAX_Wifi_Interfaces; j++){ if(Interfaces[j].InterfaceGuid == *pInterfaceGuid){ pWLCP = (PWLAN_CONNECTION_PARAMETERS)WlanAllocateMemory(sizeof(WLAN_CONNECTION_PARAMETERS)); pWLCP->strProfile = Interfaces[j].strProfileName; pWLCP->wlanConnectionMode = 0; // wlan_connection_mode_profile pWLCP->pDot11Ssid = NULL; //pDot11_DDSI; pWLCP->pDesiredBssidList = NULL; pWLCP->dot11BssType = 1; // dot11_BSS_type_infrastructure; pWLCP->dwFlags = 0;//0xF; Result |= (ERROR_SUCCESS == WlanConnect(hClient, pInterfaceGuid, pWLCP, NULL)); WlanFreeMemory(pWLCP); } } } else if(ERROR_SUCCESS == WlanGetAvailableNetworkList(hClient, pInterfaceGuid, 1, NULL, &pNetworkList)){ for(int j=0; j < pNetworkList->dwNumberOfItems; j++){ if(pNetworkList->Network[j].dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED){ lstrcpynW(Interfaces[i].strProfileName, pNetworkList->Network[j].strProfileName, 256); Interfaces[i].InterfaceGuid = *pInterfaceGuid; Result |= (ERROR_SUCCESS == WlanDisconnect(hClient, pInterfaceGuid, NULL)); } } } } WlanFreeMemory(pInterfaceInfoList); } WlanCloseHandle(hClient, NULL); } return Result; }
Y esta sería la versión para delphi:
delphi
// Desconecta o conecta las redes Wifi guardandolas al desconectar // Con hasta 10 adaptadores wifi en el PC type TWLANConnected = record strProfileName: array [0..255] of WCHAR; InterfaceGuid: TGUID; end; const MAX_Wifi_Interfaces = 10; var Interfaces: array [0..MAX_Wifi_Interfaces] of TWLANConnected; function Wifi_Connect_DisConnect2(connect: BOOL): BOOL; var hClient: THandle; dwVersion: DWORD; pInterfaceInfoList: PWLAN_INTERFACE_INFO_LIST; pInterfaceGuid: PGUID; pWLCP: PWLAN_CONNECTION_PARAMETERS; pNetworkList: PWLAN_AVAILABLE_NETWORK_LIST; i, j: integer; begin Result:= false; if ERROR_SUCCESS = WlanOpenHandle(1, nil, @dwVersion, @hClient) then begin if ERROR_SUCCESS = WlanEnumInterfaces(hClient, nil, @pInterfaceInfoList) then begin for i:= 0 to pInterfaceInfoList^.dwNumberOfItems - 1 do begin if i >= MAX_Wifi_Interfaces then break; pInterfaceGuid:= @pInterfaceInfoList^.InterfaceInfo[pInterfaceInfoList^.dwIndex].InterfaceGuid; if connect then begin for j:=0 to MAX_Wifi_Interfaces-1 do begin if IsEqualGUID(Interfaces[j].InterfaceGuid, pInterfaceGuid^) then begin pWLCP:= WlanAllocateMemory(sizeof(TWLAN_CONNECTION_PARAMETERS)); pWLCP.strProfile:= Interfaces[j].strProfileName; pWLCP.wlanConnectionMode:= 0; // wlan_connection_mode_profile pWLCP.pDot11Ssid:= nil; //pDot11_DDSI; pWLCP.pDesiredBssidList:= nil; pWLCP.dot11BssType:= 1; // dot11_BSS_type_infrastructure; pWLCP.dwFlags:= 0; Result:= Result or (ERROR_SUCCESS = WlanConnect(hClient, pInterfaceGuid, pWLCP, nil)); WlanFreeMemory(pWLCP); end; end; end else if ERROR_SUCCESS = WlanGetAvailableNetworkList(hClient, pInterfaceGuid, 1, nil, pNetworkList) then begin for j:=0 to pNetworkList^.dwNumberOfItems-1 do begin if (pNetworkList^.Network[j].dwFlags and WLAN_AVAILABLE_NETWORK_CONNECTED) <> 0 then begin lstrcpynW(Interfaces[i].strProfileName, pNetworkList^.Network[j].strProfileName, 256); Interfaces[i].InterfaceGuid:= pInterfaceGuid^; Result:= Result or (ERROR_SUCCESS = WlanDisconnect(hClient, pInterfaceGuid, nil)); end; end; end; end; WlanFreeMemory(pInterfaceInfoList); end; WlanCloseHandle(hClient, nil); end; end;
El uso es bien simple:
delphi
Wifi_Connect_DisConnect2(true); // Para conectar Wifi_Connect_DisConnect2(false); // Para desconectar
Subo un proyecto para delphi con las definiciones estrictamente necesarias, en este proyecto, para usar Wlanapi.
Saludos.