0

我在以下代码中使用了 Microsoft 的 WLAN API(我只留下了示例中的相关部分):

WLAN_INTERFACE_INFO_LIST结构体

WLAN_INTERFACE_INFO结构体

WlanEnumInterfaces()功能

WlanFreeMemory()功能

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_INFOstruct 变量而只保留一个PWLAN_INTERFACE_INFO?

4

1 回答 1

1

还会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
于 2016-03-24T12:00:00.257 回答