Вопрос по windows, visual-c++, c++ – GetAdaptersInfo и GetAdaptersAddressess BufferLength Param

1

У меня здесь есть какой-то устаревший код на C ++, который делает некоторые вещи, которые я не понимаю. Я запускаю его в Visual C ++ 2008 Express Edition на компьютере под управлением Windows XP.

Код использует некоторые функции Windows:GetAdaptersInfo и GetAdaptersAddressess. Я понимаю, что последний параметр для них обоих - это указатель на размер буфера, и, поскольку он in_out, он может быть изменен внутри функции.

Мой вопрос: эти функции должны изменить длину буфера?

В коде, который у меня есть, каждый раз, когда эти функции называются, переменная длины буфера инициализируется в ноль, а после вызова функции она по-прежнему равна 0.

Ваш Ответ

3   ответа
3

// First get the desired size.
unsigned long outBufLen = 0;
DWORD dwResult = GetAdaptersInfo(NULL, &outBufLen);
if (dwResult == ERROR_BUFFER_OVERFLOW)  // This is what we're expecting
{
    // Now allocate a structure of the requried size.
    PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO) malloc(outBufLen);
    dwResult = GetAdaptersInfo(pIpAdapterInfo, &outBufLen);
    if (dwResult == ERROR_SUCCESS)
    {
        // Yay!

Edit: См. Также ответ Джереми Фризнера о том, почему этого кода недостаточно.

Error: User Rate Limit Exceeded RCC
Error: User Rate Limit Exceeded
6

@ RichieHindle ответ содержит условие гонки .... если размер структуры, которую Windows хочет вернуть, увеличивается после первого вызова GetAdaptersInfo (), но перед вторым вызовом GetAdaptersInfo (), второй вызов GetAdaptersInfo () также завершится ошибкой с ERROR_BUFFER_OVERFLOW и ваша функция не будет работать.

Да, это происходит в реальной жизни - у меня было это со мной. Если вы хотите, чтобы код был надежным, вам нужно вызывать GetAdaptersInfo () в цикле, увеличивая размер буфера столько раз, сколько необходимо, пока вызов не будет успешным.

Должен быть менее подверженный ошибкам способ создания API ... к сожалению, Microsoft еще не нашла его. : ^ P

Error: User Rate Limit Exceeded
1

используя Visual studio 6, я использовал количество адаптеров:

DWORD drc = GetAdaptersInfo(NULL, &(Buflen = 0L));

if (drc == ERROR_BUFFER_OVERFLOW)
  n = Buflen / sizeof(IP_ADAPTER_INFO);

Все было в порядке, например, для 2 адаптеров Buflen был установлен на 1280 иsizeof(IP_ADAPTER_INFO) было 640.

Теперь я использую Visual C ++ 2008 Express, и мой результат урезан, потому что функция все еще устанавливает Buflen на 1280, но значениеsizeof(IP_ADAPTER_INFO) сейчас 648!

Это ошибка или я что-то упустил?

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/windows/desktop/…

Похожие вопросы