我正在尝试为我的一个朋友做一些硬件生成,我注意到GetAdaptersInfo有点奇怪。根据{{3}},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。
答案 0 :(得分:5)
eax
此后返回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
和一个C风格的演员,但您可能更喜欢使用malloc
和C ++样式演员。由于我自己缺乏熟悉,我没有做到这一点。
显然你需要在完成记忆后释放记忆。