Я использую WLAN API от Microsoft в следующем коде (я оставил только соответствующие части из примера):
WLAN_INTERFACE_INFO_LIST
состав
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
WLAN_INTERFACE_INFO pIfInfo = NULL;
WlanEnumInterfaces(hClient, NULL, &pIfList);
pIfInfo = pIntfList->InterfaceInfo[i];
WlanFreeMemory(pIfList);
Я сохраняю активный интерфейс, который находится в pIntfList->InterfaceInfo[i]
, чтобы pIfInfo
,
Будет WlanFreeMemory(pIfList)
также бесплатно pIfInfo
и оставить эту переменную бесполезной? Или его значения копируются в новую структуру при выполнении pIfInfo = pIntfList->InterfaceInfo[i]
?
Есть ли способ избежать сохранения всего WLAN_INTERFACE_INFO
переменная структуры и только сохраняя PWLAN_INTERFACE_INFO
?
Будет
WlanFreeMemory(pIfList)
также бесплатноpIfInfo
и оставить эту переменную бесполезной?
№ Ваша переменная pIfInfo
на самом деле структура, а не указатель. Поэтому, когда вы пишете
WLAN_INTERFACE_INFO pIfInfo = NULL;
WlanEnumInterfaces(hClient, NULL, &pIfList);
pIfInfo = pIntfList->InterfaceInfo[i];
вы берете копию структуры. Обратите внимание, что код не компилируется, потому что вы не можете назначить NULL
в структуру. Обратите внимание, что pIfInfo
плохой выбор имени, потому что для чтения подразумевается, что переменная является указателем.
Теперь призыв к WlanFreeMemory(pIfList)
освободит всю выделенную память, включая массив pIntfList->InterfaceInfo[]
, Но так как вы берете копию структуры, копию элемента i
массива, который не влияет на вас.
Я бы наверное написал ваш код так:
PWLAN_INTERFACE_INFO_LIST pIfList;
if (WlanEnumInterfaces(hClient, NULL, &pIfList) != ERROR_SUCCESS)
{
// handle error
}
WLAN_INTERFACE_INFO IfInfo = pIntfList->InterfaceInfo[i];
WlanFreeMemory(pIfList);
// can still use IfInfo, but not pIfList
Других решений пока нет …