我目前正在尝试为我的一个 friend 做一些硬件生成,我注意到GetAdaptersInfo有点奇怪。根据MSDN,pOutBufLen应该指向一个保存sizeof(IP_ADAPTER_INFO)
值的变量(640)。但是,当我使用该值时,它将返回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);
在此返回
outBufLen
中的值之后,您应该在后续调用中传递该长度的缓冲区。您不这样做,因此会出现运行时错误。您需要使用
pAdapterInfo
返回的长度动态分配outBufLen
。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++样式转换。我不是由于自己不熟悉而这样做的。显然,完成后需要释放内存。