|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Список Wi-Fi - сетей
Доброго времени суток!
Пишу программу (гламурную панельку вроде той, что была в Висте), одной из функций которой является показ списка точек Wi-Fi, видимых в округе в настоящий момент. Собственно, вопрос: каким компонентом можно получить список точек доступа из-под Delphi? Нужно имя, тип шифрования и мощность сигнала. |
#2
|
||||
|
||||
Пользуйте нативный API
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Видел. Все примеры на С. А в С я дуб Есть ли какие статьи или книги почитать по этой теме? Гугль ничего внятнее заброшенных веток форумов не выдает.
|
#4
|
||||
|
||||
Дак выкладывай сишный, авось кто поможет перевести.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Вот одна из переводилок с Си на раскаль, хотя в принципе всё равно на каком ЯПе дано описание, здесь задача вырисовывается в следующем (есно, имхо) : сначало нужно подключиться к библиотеке Wlanapi.dll, примерно так, если только stackoverflow не ошибается
Код:
type TWlanOpenHandle = function( dwClientVersion:DWORD; pReserved:Pointer; pdwNegotiatedVersion:PDWORD; phClientHandle:PHANDLE ):DWORD; stdcall; function apiWlanOpenHandle( dwClientVersion:DWORD; pReserved:Pointer; pdwNegotiatedVersion:PDWORD; phClientHandle:PHANDLE ):DWORD; implementation ... function apiWlanOpenHandle ( dwClientVersion:DWORD; pReserved:Pointer; pdwNegotiatedVersion:PDWORD; phClientHandle:PHANDLE ):DWORD; var WlanOpenHandle: TWlanOpenHandle; DLL: Cardinal; begin DLL:=LoadLibrary('Wlanapi.dll'); WlanOpenHandle := GetProcAddress(DLL, 'WlanOpenHandle'); if Assigned(WlanOpenHandle) then begin WlanOpenHandle(dwClientVersion, pReserved, pdwNegotiatedVersion, phClientHandle); end else begin ShowMessage('Function not found'); end; end; Все начинается с создания клиентской сессии путем вызова WlanOpenHandle, затем Вы можете либо проверить версию операционной системы и передавать в качестве версии (dwClientVersion) 1 для Windows XP, 2 для Windows Vista и выше, либо всегда передавать 2. Даже в Windows XP вызов функции будет успешным, а pdwNegotiatedVersion укажет нам на выбранную ОС версию клиента. Клиент создан, хэндл на него получен, теперь необходимо выбрать интерфейс, с которым мы будем работать. Список доступных интерфейсов мы получим вызвав WlanEnumInterfaces, описание Цитата:
О количестве доступных интерфейсов нам расскажет член структуры WLAN_INTERFACE_INFO_LIST — dwNumberOfItems. Теперь мы можем вызвать WlanGetAvailableNetworkList и получить список доступных сетей Цитата:
Параметр dwFlags может принимать следующие значения: WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES и WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_P ROFILES. Конечная цель ppAvailableNetworkList — указатель на структуру WLAN_AVAILABLE_NETWORK_LIST, которая в свою очередь содержит массив структур WLAN_AVAILABLE_NETWORK, которые в свою очередь описывают параметры каждой найденной сети. После того, как мы получили, то, что хотели, необходимо освободить все указатели и закрыть все хэндлы. Указатели на список интерфейсов и список сетей освобождаем путем вызова WlanFreeMemory, клиентскую сессию закрываем используя WlanCloseHandle. Описания структур см. в данной статье. Похоже, это всё Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
|||
|
|||
ОК, если кто поможет - я только за!
Нашел тем временем еще вариант - тоже на С. Вот он. Что понравилось - человек объясняет, что и зачем он делает. Так что думаю код из статьи взять за основу. С первым куском кода из статьи я разобрался, попутно научившись у Гугла подключать сишные dll-ки Но вот застрял теперь тут: Код:
... implementation ... function WlanEnumInterfaces(hClientHandle:THandle; pReserved: pointer; ppInterfaceList: PWLAN_INTERFACE_INFO_LIST): DWORD; stdcall; external 'wlanapi.dll' name 'WlanEnumInterfaces'; ... {$R *.dfm} Ага, и я про ту же статью с Хабра)) p.s.: Спасибо за переводилку Последний раз редактировалось M.A.D.M.A.N., 20.07.2014 в 23:11. |
#7
|
|||
|
|||
Цитата:
Скорее всего просто тоже надо описать тип. Вот структура записи из MSDN: Код:
typedef struct _WLAN_INTERFACE_INFO_LIST { DWORD dwNumberOfItems; DWORD dwIndex; WLAN_INTERFACE_INFO InterfaceInfo[]; } WLAN_INTERFACE_INFO_LIST, *PWLAN_INTERFACE_INFO_LIST; ЗЫ. Как только встречаешь что-то незнакомое при работе с WinAPI, то в гугле вбиваешь "MSDN что-у-тебя-там" и читаешь оригинальную справку Микрософта и думаешь, как это переписать/объявить в Дельфи. ЗЗЫ. А на Delphi0Jedi не смотрел, готового переведенного API нету? |
#8
|
||||
|
||||
<DELETED>
З.Ы. lmikle опередил Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 22.07.2014 в 23:34. |
#9
|
|||
|
|||
Этот тип используется в самой dll, поскольку это её идентификатор. Следовательно, он должен быть уже определен в ней. Я правильно понимаю? Может, его тоже можно как-то позаимствовать из библиотеки?
Еще, правильно ли я понял фразу из MSDN "WLAN_AVAILABLE_NETWORK_LIST structure contains an array of NIC interface information" - что WLAN_AVAILABLE_NETWORK_LIST это массив (array), элементы которого описываются структурой: Код:
typedef struct _WLAN_INTERFACE_INFO_LIST { DWORD dwNumberOfItems; DWORD dwIndex; WLAN_INTERFACE_INFO InterfaceInfo[]; } WLAN_INTERFACE_INFO_LIST, *PWLAN_INTERFACE_INFO_LIST; З.Ы.: Я так похоже, скоро выучу С, плюну на все эти заморочки и напишу на нем всю прогу Ну, за час копания MSDN и Гугла вырисовалось следующее: Код:
type Tfrm_Main = class(TForm) ... end; WLAN_INTERFACE_STATE = (wlan_interface_state_not_ready, wlan_interface_state_connected, wlan_interface_state_ad_hoc_network_formed, wlan_interface_state_disconnecting, wlan_interface_state_disconnected, wlan_interface_state_associating, wlan_interface_state_discovering, wlan_interface_state_authenticating); WLAN_INTERFACE_INFO = record InterfaceGuid: GUID; strInterfaceDescription: array [1..256] of WChar; isState: WLAN_INTERFACE_STATE; end; WLAN_AVAILABLE_NETWORK_LIST = record dwNumberOfItems: dword; dwIndex: dword; Network: array of WLAN_INTERFACE_INFO; end; var frm_Main: Tfrm_Main; implementation ... function WlanEnumInterfaces(hClientHandle:THandle; pReserved: pointer; ppInterfaceList: PWLAN_INTERFACE_INFO_LIST): DWORD; stdcall; external 'wlanapi.dll' name 'WlanEnumInterfaces'; ... {$R *.dfm} WLAN_INTERFACE_STATE WLAN_INTERFACE_INFO WLAN_AVAILABLE_NETWORK_LIST PWLAN_INTERFACE_INFO_LIST Посмотрите, не накосячил ли я где... И да, еще не смог понять, что такое GUID с 16-й строки листинга - "Undeclared identifier: 'GUID'". Гугл выдал целую пачку вариантов, но не знаю, какой из них тот. MSDN тоже не дал ответа (или я не там искал?) Во всё той же хабрастатье наткнулся: Цитата:
Голова уже квадратная, пойду спать, пожалуй... Последний раз редактировалось M.A.D.M.A.N., 21.07.2014 в 09:15. |
#10
|
|||
|
|||
В Дельфи GUID это TGUID, если я привильно помню...
PS. Ну с/с++ выучить все-равно неплохо было бы, т.к. куча примеров и документации на нем. А вот писать на нем, тем более GUI, нет уж, увольте. Говорю как человек, написавший не одну прогрмму на с & mfc/atl. Вот с WinForms еще ничего, но там другая проблема - приходится протаскивать нативные вызовы через обертки в .нет Последний раз редактировалось lmikle, 21.07.2014 в 05:53. |
#11
|
||||
|
||||
Ага, спасибо, TGUID Delphi принял
Пересмотрел свой вчерашний код и увидел косяк Буду исправлять. Вот, исправленное. Delphi ошибок не находит. Код:
type Tfrm_Main = class(TForm) ... end; WLAN_INTERFACE_STATE = (wlan_interface_state_not_ready, wlan_interface_state_connected, wlan_interface_state_ad_hoc_network_formed, wlan_interface_state_disconnecting, wlan_interface_state_disconnected, wlan_interface_state_associating, wlan_interface_state_discovering, wlan_interface_state_authenticating); WLAN_INTERFACE_INFO = record InterfaceGuid: TGUID; strInterfaceDescription: array [1..256] of WChar; isState: WLAN_INTERFACE_STATE; end; PWLAN_INTERFACE_INFO_LIST = record dwNumberOfItems: dword; dwIndex: dword; Network: array of WLAN_INTERFACE_INFO; end; var frm_Main: Tfrm_Main; implementation ... function WlanEnumInterfaces(hClientHandle:THandle; pReserved: pointer; ppInterfaceList: PWLAN_INTERFACE_INFO_LIST): DWORD; stdcall; external 'wlanapi.dll' name 'WlanEnumInterfaces'; ... {$R *.dfm} WLAN_INTERFACE_STATE WLAN_INTERFACE_INFO PWLAN_INTERFACE_INFO_LIST Народ, у меня образовалась куча непоняток, я не понимаю, как сделать правильно: 1. Что означает звездочка в С? Она ж не спроста... Цитата:
2. Непонятные конструкции: Цитата:
Цитата:
3. Не понял вот это - то есть Цитата:
4. MSDN: "WLAN_SIGNAL_QUALITY is of type ULONG." (На этой странице) Многие значения определены типом ULONG. На каком-то форуме нашел, что он соответствует дельфийскому Longint. То есть, можно смело заменять у себя одно другим или есть подводные камни? В общем, я не знаю, какой Кащей писал этот код, где тип переменной описывается структурой, в типы полей которой вложена пачка других структур, в которых творится тоже самое... Когда все заработает - оформлю в статью и выложу на Хабре, пусть другие пользуются. Последний раз редактировалось Agat330, 21.07.2014 в 15:38. |
#12
|
||||
|
||||
Agat330, заколебал плодить сообщения по 3 штуки за раз, пользуйся кнопкой "правка".
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#13
|
|||
|
|||
Пользуюсь, не сомневайся
|
#14
|
|||
|
|||
Цитата:
1. * = указатель. Можно у себя описать как честный указатель, можно описать как var переменную. 2. Массив байт (можно использовать тип Byte) длинны WLAN_MAX_PHY_TYPE_NUMBER+1 (начинается с 0). 3. Да, можно поставить просто DWORD, unless там указатель, тогда надо ставить указатель на DWORD. 4. ULONG - беззнаковый long, можно подставиь LongInt, можно, если правильно помню - cardinal (т.е. беззнаковый). |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Agat330 (22.07.2014)
|
#15
|
|||
|
|||
Код:
DOT11_AUTH_ALGORITHM = (DOT11_AUTH_ALGO_80211_OPEN = $1, ... DOT11_AUTH_ALGO_RSNA_PSK = $7, // на С было DOT11_AUTH_ALGO_IHV_START = $80000000, // 0x80000000 DOT11_AUTH_ALGO_IHV_END = $ffffffff); // 0xffffffff DOT11_CIPHER_ALGORITHM = (DOT11_CIPHER_ALGO_NONE = $00, ... DOT11_CIPHER_ALGO_WEP = $101, // на С было DOT11_CIPHER_ALGO_IHV_START = $80000000, // 0x80000000 DOT11_CIPHER_ALGO_IHV_END = $ffffffff); // 0xffffffff Эээ... Может вопрос глупый, но почему-то на последние две строчки этих перечислений компилятор выдает Цитата:
P.S.: Что означают VOID здесь и PVOID здесь? Последний раз редактировалось Agat330, 23.07.2014 в 21:50. |