Сначала мы вызываем функцию с pcServices=0 и pGuidServices=nil для того, чтобы получить количество сервисов, предоставляемых устройством.
Потом выделяем память (SetLength()) и только затем вызываем функцию с реальными параметрами и получаем список сервисов.
Еще важное замечание. В файле JwaBluetoothAPIs.pas параметр pbtdi имеет тип PBLUETOOTH_DEVICE_INFO, который раскрывается в BLUETOOTH_DEVICE_INFO. Заметьте, что это НЕ УКАЗАТЕЛЬ. Это не верно, так как в исходном виде функция требует именно указатель. По-этому, я ввел тип
type
__PBLUETOOTH_DEVICE_INFO = ^PBLUETOOTH_DEVICE_INFO
Так что ИСПОЛЬЗУЙТЕ файл из примера, а не из исходной библиотеки. Иначе получите нарушение доступа к памяти.
Комментарий к коду: Мы перечитываем информацию об устройстве, так как за время, пока мы любуемся программой, могли произойти различные события: устройство отключили, отменили авторизацию и т. п. А мы хотим иметь самую свежую информацию об устройстве.
В принципе то, что описано выше, мы уже знали, кроме двух указанных функций.
Давайте расширим возможности нашего приложения. Добавим функции запрета/разрешения обнаружения радиомодуля и запрета/разрешения подключения к нему.
BluetoothEnableIncomingConnections и BluetoothEnableDiscoverable
Поместим на форму компонент TactionList и изменим его свойства как показано в таблице.
Свойство |
Значение |
Name |
ActionList |
Теперь два раза щелкнем по ActionList и в появившемся окне редактора свойств добавим две TAction со следующими свойствами:
Свойство |
Значение |
Caption |
Connectable |
Name |
acConnectable |
Свойство |
Значение |
Caption |
Discoverable |
Name |
acDiscoverable |
На панель Panel добавим две TButton и установим свойства:
Свойство |
Значение |
Action |
acConnectable |
Name |
btConnectable |
Свойство |
Значение |
Action |
acDiscoverable |
Name |
btDiscoverable |
Напишем вот такой обработчик события OnUpdate у acConnectable:
Code: |
procedure TfmMain.acConnectableUpdate(Sender: TObject); var SelectedItem: TListItem; SelectedNode: TTreeNode; begin SelectedNode := TreeView.Selected; SelectedItem := ListView.Selected;
with TAction(Sender) do begin Enabled := Assigned(SelectedNode) and Assigned(SelectedItem) and (SelectedNode.ImageIndex = -1);
if Enabled then if StrToBool(SelectedItem.SubItems[4]) then Caption := 'Not conn.' else Caption := 'Connectable'; end; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!