GetAdaptersInfo 崩溃
GetAdaptersInfo crashing
我目前正在尝试为我的一个朋友生成一些硬件,我注意到 GetAdaptersInfo 的行为有点奇怪。根据 MSDN,pOutBufLen 应该指向一个变量,其中包含 sizeof(IP_ADAPTER_INFO)
(640) 的值。但是,当我使用该值 returns 111 (ERROR_BUFFER_OVERFLOW
) 并将 outBufLen 设置为 2560 时。当调用 outBufLen 设置为 2560 的函数时,它会崩溃。
最小复制代码:
#include <windows.h>
#include <Iphlpapi.h>
int main()
{
IP_ADAPTER_INFO adapter_inf;
unsigned long int outBufLen = sizeof(IP_ADAPTER_INFO);
GetAdaptersInfo(nullptr, &outBufLen); // returning 111 (ERROR_BUFFER_OVERFLOW) and setting outBufLen to 2560
GetAdaptersInfo(&adapter_inf, &outBufLen); // crash during this call
return 0;
}
不知道这是否重要,但 64 位 Windows 此处为 8。
GetAdaptersInfo(nullptr, &outBufLen);
在此 returns 中的一个值之后 outBufLen
您应该在后续调用中传递该长度的缓冲区。您不这样做,因此会出现运行时错误。
您需要使用 outBufLen
中返回的长度动态分配 pAdapterInfo
。
ULONG outBufLen = 0;
if (GetAdaptersInfo(nullptr, &outBufLen) != ERROR_BUFFER_OVERFLOW)
// handle error
PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen);
if (GetAdaptersInfo(pAdapterInfo, &outBufLen) != ERROR_SUCCESS)
// handle error
我在这里使用了 malloc
和 C 风格转换,但您可能更喜欢使用 new
和 C++ 风格转换。我没有这样做是因为我自己不熟悉。
显然你需要在用完后释放内存。
我目前正在尝试为我的一个朋友生成一些硬件,我注意到 GetAdaptersInfo 的行为有点奇怪。根据 MSDN,pOutBufLen 应该指向一个变量,其中包含 sizeof(IP_ADAPTER_INFO)
(640) 的值。但是,当我使用该值 returns 111 (ERROR_BUFFER_OVERFLOW
) 并将 outBufLen 设置为 2560 时。当调用 outBufLen 设置为 2560 的函数时,它会崩溃。
最小复制代码:
#include <windows.h>
#include <Iphlpapi.h>
int main()
{
IP_ADAPTER_INFO adapter_inf;
unsigned long int outBufLen = sizeof(IP_ADAPTER_INFO);
GetAdaptersInfo(nullptr, &outBufLen); // returning 111 (ERROR_BUFFER_OVERFLOW) and setting outBufLen to 2560
GetAdaptersInfo(&adapter_inf, &outBufLen); // crash during this call
return 0;
}
不知道这是否重要,但 64 位 Windows 此处为 8。
GetAdaptersInfo(nullptr, &outBufLen);
在此 returns 中的一个值之后 outBufLen
您应该在后续调用中传递该长度的缓冲区。您不这样做,因此会出现运行时错误。
您需要使用 outBufLen
中返回的长度动态分配 pAdapterInfo
。
ULONG outBufLen = 0;
if (GetAdaptersInfo(nullptr, &outBufLen) != ERROR_BUFFER_OVERFLOW)
// handle error
PIP_ADAPTER_INFO pAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen);
if (GetAdaptersInfo(pAdapterInfo, &outBufLen) != ERROR_SUCCESS)
// handle error
我在这里使用了 malloc
和 C 风格转换,但您可能更喜欢使用 new
和 C++ 风格转换。我没有这样做是因为我自己不熟悉。
显然你需要在用完后释放内存。