Сбой GetAdaptersInfo

В настоящее время я пытаюсь сделать какое-то оборудование для моего друга, и я заметил, что 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 здесь.

3

Решение

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 ++. Я не сделал это из-за моего отсутствия знакомства.

Очевидно, вам нужно освободить память, когда вы закончите с этим.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]