Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разбор ошибок при запросе номера канала Wi-Fi через WinAPI и WlanQueryInterface в Delphi

Delphi , Синтаксис , Справочник по API-функциям

Разбор ошибок при запросе номера канала Wi-Fi через WinAPI и WlanQueryInterface в Delphi

Вопрос, с которым вы столкнулись, связан с использованием функции WlanQueryInterface для получения номера канала Wi-Fi в среде Delphi. При вызове этой функции вы получаете большое целое число, например, 1820789, вместо ожидаемого номера канала, такого как 10 или 11. Давайте разберемся в этом вопросе и найдем решение.

Описание проблемы

В коде, который вы предоставили, используется функция GetWifiChannelTest, которая должна возвращать номер канала Wi-Fi. Однако, вместо получения корректного значения, функция возвращает большое целое число, что указывает на ошибку в логике работы с данными.

Подробный разбор кода

uses nduWlanTypes, nduWlanAPI;

Function GetWifiChannelTest: String;
var
  hClient: THandle;
  dwVersion: DWORD;
  ResultInt: DWORD;
  pInterface: Pndu_WLAN_INTERFACE_INFO_LIST;
  i: Integer;
  pInterfaceGuid: TGUID;
  pdwDataSize: DWORD;
  ppData: Tndu_WLAN_INTF_OPCODE;
  pI: PInteger;
  p: PVoid;
begin
  // ...
end;

В вашем коде есть несколько моментов, на которые стоит обратить внимание:

  1. Вы используете Tndu_WLAN_INTF_OPCODE в качестве типа данных для ppData, что неверно, так как wlan_intf_opcode_channel_number должен возвращать ULONG, а не Tndu_WLAN_INTF_OPCODE.
  2. Вы используете dwIndex вместо i для доступа к элементам массива InterfaceInfo[].
  3. Вы не корректно обрабатываете память, выделенную функцией WlanEnumInterfaces.

Подтвержденный ответ

В подтвержденном ответе указано, что вы неверно перебираете интерфейсы и некорректно вызываете WlanQueryInterface. Вместо Tndu_WLAN_INTF_OPCODE для ppData следует использовать PULONG, так как wlan_intf_opcode_channel_number возвращает значение типа ULONG. Также вы должны использовать счетчик цикла i для доступа к элементам списка интерфейсов, а не dwIndex.

Кроме того, после использования WlanEnumInterfaces необходимо освободить выделенную память с помощью WlanFreeMemory.

Исправленный код

uses
  nduWlanTypes, nduWlanAPI;
Function GetWifiChannelTest: String;
var
  hClient: THandle;
  dwVersion: DWORD;
  ResultInt: DWORD;
  pIntfList: PWLAN_INTERFACE_INFO_LIST;
  i: DWORD;
  IntfGuid: TGUID;
  dwDataSize: DWORD;
  ChannelNumber: ULONG;
begin
  Result := '';
  // ...
  // Инициализация клиента
  ResultInt := WlanOpenHandle(1, nil, @dwVersion, @hClient);
  if ResultInt <> ERROR_SUCCESS then
  begin
    ShowMessage('Error Open Client: ' + IntToStr(ResultInt));
    Exit;
  end;
  try
    // Перечисление интерфейсов
    ResultInt := WlanEnumInterfaces(hClient, nil, @pIntfList);
    if ResultInt <> ERROR_SUCCESS then
    begin
      ShowMessage('Error Enumerating Interfaces: ' + IntToStr(ResultInt));
      Exit;
    end;
    try
      // Перебор интерфейсов
      for i := 0 to pIntfList^.dwNumberOfItems - 1 do
      begin
        IntfGuid := pIntfList^.InterfaceInfo[i].InterfaceGuid;
        // Получение номера канала
        ResultInt := WlanQueryInterface(hClient, @IntfGuid, wlan_intf_opcode_channel_number, nil, @dwDataSize, @ChannelNumber, nil);
        if ResultInt = ERROR_SUCCESS then
        begin
          Result := IntToStr(ChannelNumber);
          Exit;
        end;
      end;
    finally
      // Освобождение памяти
      WlanFreeMemory(pIntfList);
    end;
  finally
    WlanCloseHandle(hClient, nil);
  end;
end;

Обновление

После дополнительного рассмотрения было замечено, что wlan_intf_opcode_channel_number может возвращать указатель на ULONG, поэтому ppData следует определить как PULONG, а не как Tndu_WLAN_INTF_OPCODE. Это означает, что вы должны передать указатель на указатель для ULONG, чтобы затем можно было дереференцировать указатель на получение фактического значения ULONG.

uses nduWlanTypes, nduWlanAPI;
Function GetWifiChannelTest: String;
var
  hClient: THandle;
  dwVersion: DWORD;
  ResultInt: DWORD;
  pIntfList: PWLAN_INTERFACE_INFO_LIST;
  i: DWORD;
  IntfGuid: TGUID;
  dwDataSize: DWORD;
  pChannelNumber: PULONG;
begin
  Result := '';
  // ...
  // Здесь код аналогичен предыдущему, но с измененным типом для ppData
end;

Заключение

После внесения этих исправлений вы должны получить корректный номер канала Wi-Fi в виде ULONG. Если вы все еще сталкиваетесь с проблемами, убедитесь, что ваша программа имеет необходимые разрешения для доступа к данным Wi-Fi и что API Windows корректно установлены на вашей системе.

Создано по материалам из источника по ссылке.

Описание контекста: Пользователь столкнулся с проблемой получения номера канала Wi-Fi через WinAPI и функцию WlanQueryInterface в среде разработки Delphi, и требуется разбор ошибки, связанной с неправильным получением и интерпретацией данных.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:45:26/0.011521100997925/0