окна — ERROR_ACCESS_DENIED при использовании BluetoothLEAdvertWatcher в C ++ / WinRT

Я пытаюсь использовать BluetoothLEAdferenceWatcher для обнаружения рекламных пакетов BLE. Однако при вызове Start () объект-наблюдатель всегда прерывается с ошибкой «Доступ запрещен».

Код довольно прост и выглядит следующим образом:

auto filter = BluetoothLEAdvertisementFilter();
auto advert = BluetoothLEAdvertisement();
advert.LocalName(L"Greeny");
filter.Advertisement(advert);
m_watcher.AdvertisementFilter(filter);

// setup event handlers
m_watcher.Received({ this, &MainPage::OnAdvertisementRecieved });
m_watcher.Stopped({ this, &MainPage::OnAdvertisementStopped });

m_watcher.Start();

m_watcher — член класса, объявленный как:

BluetoothLEAdvertisementWatcher m_watcher;

Обработчики событий объявляются как:

void MainPage::OnAdvertisementRecieved(BluetoothLEAdvertisementWatcher const& watcher, BluetoothLEAdvertisementReceivedEventArgs const& args)
{
OutputDebugString(L"Bluetooth advertisement received!\n");
}

void MainPage::OnAdvertisementStopped(Windows::Devices::Bluetooth::Advertisement::BluetoothLEAdvertisementWatcher const & watcher, Windows::Devices::Bluetooth::Advertisement::BluetoothLEAdvertisementWatcherStoppedEventArgs const & args)
{
OutputDebugString(L"Advertising stopped\n");
}

Этот код очень похож на пример кода в SDK, который находится в C #. Я пытаюсь сделать то же самое в C ++, поскольку я более знаком с этим.

Есть идеи, что может пойти не так? Я попытался удалить все фильтры, то есть с помощью наблюдателя в его состоянии по умолчанию. Это тоже дает ту же ошибку. Удаление обработчиков событий также приводит к той же ошибке.

Заранее спасибо.

РЕДАКТИРОВАТЬ: изменил заголовок, добавив ERROR_ACCESS_DENIED.

EDIT2: точное место, где происходит ошибка:
onecoreuap \ drivers \ wdm \ bluetooth \ user \ winrt \ advertising \ bluetoothleadvertisewatcher.cpp (1510) \ Windows.Devices.Bluetooth.dll! 0F479314: (вызывающий абонент: 0F47AD40) Исключение (2) tid (2c1c) 80070005 Доступ запрещен.

0

Решение

Это хорошая идея, чтобы установить m_watcher.ScanningMode = Active; перед вызовом Start ();

Кроме того, если вы разрабатываете не UWP (классическое) приложение, вы должны быть уверены, что WinRT инициализирован правильно. Как WinRT, основанный на технологии COM, хорошо инициализировать WinRT до того, как будет сделан любой другой вызов COM. Однако некоторые приложения, основанные на любых платформах (например, MFC, Delphi VCL или другие), могут внутренне инициализировать COM с помощью пользовательских параметров. В этом случае рекомендуется вызывать RoInitialize (RO_INIT_MULTITHREADED) из отдельного потока.

Microsoft пишет, что WinRT должен быть инициализирован с флагом RO_INIT_MULTITHREADED. Однако наш опыт показывает, что использование других флагов также работает, но все события WinRT будут выполняться синхронно. Не подходит для работы.

И, наконец, если вы разрабатываете приложение UWP не забудь установить возможности устройства приложения, как описано там: https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/how-to-specify-device-capabilities-for-bluetooth

Это важная вещь.

0

Другие решения

Обозреватель решений -> Package.appxmanifest -> Возможности -> Bluetooth (отметьте)

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector