我目前正在尝试为我的一个 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++样式转换。我不是由于自己不熟悉而这样做的。

显然,完成后需要释放内存。

10-06 01:51