Разбор ошибок при запросе номера канала Wi-Fi через WinAPI и WlanQueryInterface в Delphi
Вопрос, с которым вы столкнулись, связан с использованием функции WlanQueryInterface для получения номера канала Wi-Fi в среде Delphi. При вызове этой функции вы получаете большое целое число, например, 1820789, вместо ожидаемого номера канала, такого как 10 или 11. Давайте разберемся в этом вопросе и найдем решение.
Описание проблемы
В коде, который вы предоставили, используется функция GetWifiChannelTest, которая должна возвращать номер канала Wi-Fi. Однако, вместо получения корректного значения, функция возвращает большое целое число, что указывает на ошибку в логике работы с данными.
В вашем коде есть несколько моментов, на которые стоит обратить внимание:
Вы используете Tndu_WLAN_INTF_OPCODE в качестве типа данных для ppData, что неверно, так как wlan_intf_opcode_channel_number должен возвращать ULONG, а не Tndu_WLAN_INTF_OPCODE.
Вы используете dwIndex вместо i для доступа к элементам массива InterfaceInfo[].
Вы не корректно обрабатываете память, выделенную функцией 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.