Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.07.2014, 22:57
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Список Wi-Fi - сетей

Доброго времени суток!
Пишу программу (гламурную панельку вроде той, что была в Висте), одной из функций которой является показ списка точек Wi-Fi, видимых в округе в настоящий момент.
Собственно, вопрос: каким компонентом можно получить список точек доступа из-под Delphi? Нужно имя, тип шифрования и мощность сигнала.
Ответить с цитированием
  #2  
Старый 19.07.2014, 00:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Пользуйте нативный API
Ответить с цитированием
  #3  
Старый 20.07.2014, 07:07
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Видел. Все примеры на С. А в С я дуб Есть ли какие статьи или книги почитать по этой теме? Гугль ничего внятнее заброшенных веток форумов не выдает.
Ответить с цитированием
  #4  
Старый 20.07.2014, 15:18
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Дак выкладывай сишный, авось кто поможет перевести.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 20.07.2014, 16:53
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот одна из переводилок с Си на раскаль, хотя в принципе всё равно на каком ЯПе дано описание, здесь задача вырисовывается в следующем (есно, имхо) : сначало нужно подключиться к библиотеке 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, описание
Цитата:
DWORD WINAPI WlanEnumInterfaces(
__in HANDLE hClientHandle,
__reserved PVOID pReserved,
__out PWLAN_INTERFACE_INFO_LIST *ppInterfaceList
);
Здесь hClientHandle это хэндл полученный нами в результате вызова WlanOpenHandle, а ppInterfaceList указатель на список доступных интерфейсов.
О количестве доступных интерфейсов нам расскажет член структуры WLAN_INTERFACE_INFO_LIST — dwNumberOfItems.

Теперь мы можем вызвать WlanGetAvailableNetworkList и получить список доступных сетей
Цитата:
DWORD WINAPI WlanGetAvailableNetworkList(
__in HANDLE hClientHandle,
__in const GUID *pInterfaceGuid,
__in DWORD dwFlags,
__reserved PVOID pReserved,
__out PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList
);
Здесь pInterfaceGuid это указатель на GUID интерфейса, получить мы его можем из структуры WLAN_INTERFACE_INFO, список которых мы уже имеем после вызова WlanEnumInterfaces.

Параметр 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  
Старый 20.07.2014, 17:48
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

ОК, если кто поможет - я только за!
Нашел тем временем еще вариант - тоже на С. Вот он. Что понравилось - человек объясняет, что и зачем он делает. Так что думаю код из статьи взять за основу.

С первым куском кода из статьи я разобрался, попутно научившись у Гугла подключать сишные dll-ки Но вот застрял теперь тут:

Код:
...
implementation
...
function WlanEnumInterfaces(hClientHandle:THandle;
                            pReserved: pointer;
                            ppInterfaceList: PWLAN_INTERFACE_INFO_LIST): DWORD;
                            stdcall; external 'wlanapi.dll' name 'WlanEnumInterfaces';
...
{$R *.dfm}
На PWLAN_INTERFACE_INFO_LIST говорит "Undeclarated identficator". Что я делаю не так?

Ага, и я про ту же статью с Хабра))
p.s.: Спасибо за переводилку

Последний раз редактировалось M.A.D.M.A.N., 20.07.2014 в 23:11.
Ответить с цитированием
  #7  
Старый 20.07.2014, 20:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Agat330
На PWLAN_INTERFACE_INFO_LIST говорит "Undeclarated identficator". Что я делаю не так?

Скорее всего просто тоже надо описать тип. Вот структура записи из 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  
Старый 20.07.2014, 20:26
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

<DELETED>

З.Ы. lmikle опередил

Последний раз редактировалось Alegun, 22.07.2014 в 23:34.
Ответить с цитированием
  #9  
Старый 20.07.2014, 21:04
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Этот тип используется в самой 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}
Ссылки на соответствующие страницы MSDN, от которых отталкивался:
WLAN_INTERFACE_STATE
WLAN_INTERFACE_INFO
WLAN_AVAILABLE_NETWORK_LIST
PWLAN_INTERFACE_INFO_LIST

Посмотрите, не накосячил ли я где... И да, еще не смог понять, что такое GUID с 16-й строки листинга - "Undeclared identifier: 'GUID'". Гугл выдал целую пачку вариантов, но не знаю, какой из них тот. MSDN тоже не дал ответа (или я не там искал?)

Во всё той же хабрастатье наткнулся:
Цитата:
Здесь pInterfaceGuid это указатель на GUID интерфейса, получить мы его можем из структуры WLAN_INTERFACE_INFO, список которых мы уже имеем после вызова WlanEnumInterfaces
Эээ... мне кажется,или речь здесь о Wi-Fi сетевой карте? Тогда вопрос у нас получается - как объяснить Дельфе, что вот сюда подставляется вафай-адаптер? Каким это безобразие описывается типом?
Голова уже квадратная, пойду спать, пожалуй...

Последний раз редактировалось M.A.D.M.A.N., 21.07.2014 в 09:15.
Ответить с цитированием
  #10  
Старый 21.07.2014, 05:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В Дельфи GUID это TGUID, если я привильно помню...

PS. Ну с/с++ выучить все-равно неплохо было бы, т.к. куча примеров и документации на нем. А вот писать на нем, тем более GUI, нет уж, увольте. Говорю как человек, написавший не одну прогрмму на с & mfc/atl. Вот с WinForms еще ничего, но там другая проблема - приходится протаскивать нативные вызовы через обертки в .нет

Последний раз редактировалось lmikle, 21.07.2014 в 05:53.
Ответить с цитированием
  #11  
Старый 21.07.2014, 10:16
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ага, спасибо, 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}
Ссылки на соответствующие страницы MSDN, от которых отталкивался:
WLAN_INTERFACE_STATE
WLAN_INTERFACE_INFO
PWLAN_INTERFACE_INFO_LIST

Народ, у меня образовалась куча непоняток, я не понимаю, как сделать правильно:
1. Что означает звездочка в С? Она ж не спроста...
Цитата:
GUID *pInterfaceGuid
PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList

2. Непонятные конструкции:
Цитата:
UCHAR ucSSID[DOT11_SSID_MAX_LENGTH]
Цитата:
DOT11_PHY_TYPE dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER]

3. Не понял вот это - то есть
Цитата:
wlanNotConnectableReason: WLAN_REASON_CODE;
можно просто поставить DWORD и будет ОК?

4. MSDN: "WLAN_SIGNAL_QUALITY is of type ULONG." (На этой странице) Многие значения определены типом ULONG. На каком-то форуме нашел, что он соответствует дельфийскому Longint. То есть, можно смело заменять у себя одно другим или есть подводные камни?

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

Последний раз редактировалось Agat330, 21.07.2014 в 15:38.
Ответить с цитированием
  #12  
Старый 21.07.2014, 13:05
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Agat330, заколебал плодить сообщения по 3 штуки за раз, пользуйся кнопкой "правка".
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #13  
Старый 21.07.2014, 13:09
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Пользуюсь, не сомневайся
Ответить с цитированием
  #14  
Старый 22.07.2014, 04:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Agat330
Народ, у меня образовалась куча непоняток, я не понимаю, как сделать правильно:
1. Что означает звездочка в С? Она ж не спроста...

2. Непонятные конструкции:

3. Не понял вот это - то есть можно просто поставить DWORD и будет ОК?

4. MSDN: "WLAN_SIGNAL_QUALITY is of type ULONG." (На этой странице) Многие значения определены типом ULONG. На каком-то форуме нашел, что он соответствует дельфийскому Longint. То есть, можно смело заменять у себя одно другим или есть подводные камни?

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

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  
Старый 22.07.2014, 22:19
Agat330 Agat330 вне форума
Прохожий
 
Регистрация: 08.04.2014
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
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

Эээ... Может вопрос глупый, но почему-то на последние две строчки этих перечислений компилятор выдает
Цитата:
[dcc32 Warning]: W1012 Constant expression violates subrange bounds
Что я снова сделал не так?

P.S.: Что означают VOID здесь и PVOID здесь?

Последний раз редактировалось Agat330, 23.07.2014 в 21:50.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter