В настоящее время я пытаюсь сделать какое-то оборудование для моего друга, и я заметил, что 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 ++. Я не сделал это из-за моего отсутствия знакомства.
Очевидно, вам нужно освободить память, когда вы закончите с этим.
Других решений пока нет …