Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用BluetoothLEAdvertisementWatcher时出现错误“访问被拒绝”+/商在最新的_C++_Windows_Bluetooth_Windows Runtime_C++ Winrt - Fatal编程技术网

C++ 在C+中使用BluetoothLEAdvertisementWatcher时出现错误“访问被拒绝”+/商在最新的

C++ 在C+中使用BluetoothLEAdvertisementWatcher时出现错误“访问被拒绝”+/商在最新的,c++,windows,bluetooth,windows-runtime,c++-winrt,C++,Windows,Bluetooth,Windows Runtime,C++ Winrt,我正在尝试使用BluetoothLEAdvertisementWatcher来检测可屏蔽的广告包。但是,在调用Start()时,观察者对象始终会中止,并出现“访问被拒绝”错误 代码非常简单,如下所示: auto filter = BluetoothLEAdvertisementFilter(); auto advert = BluetoothLEAdvertisement(); advert.LocalName(L"Greeny"); filter.Advertisement(advert);

我正在尝试使用BluetoothLEAdvertisementWatcher来检测可屏蔽的广告包。但是,在调用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");
}
事件处理程序声明为:

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++中做同样的事情,因为我更熟悉它。 知道会出什么问题吗?我尝试删除所有过滤器,也就是说,在默认状态下使用观察程序。这也会产生同样的错误。删除事件处理程序也会导致相同的错误

提前谢谢

编辑:更改标题添加错误\u访问被拒绝

EDIT2:发生错误的确切位置是:
onecoreuap\drivers\wdm\bluetooth\user\winrt\advision\bluetoothleadvertisementwatcher.cpp(1510)\Windows.Devices.bluetooth.dll!0F479314:(调用方:0F47AD40)异常(2)tid(2c1c)80070005访问被拒绝。

解决方案资源管理器->Package.appxmanifest->功能->蓝牙(检查)

解决方案资源管理器->Package.appxmanifest->功能->蓝牙(检查)

将m_watcher.ScanningMode设置为活动状态是个好主意;在调用Start()之前

此外,如果您开发非UWP(经典)应用程序,您应该确保WinRT已正确初始化。由于WinRT是基于COM技术的,所以最好在对COM进行任何其他调用之前初始化WinRT。但是,一些基于任何框架的应用程序(例如,MFC、Delphi VCL或其他)可能会在内部使用自定义参数初始化COM。在这种情况下,最好从单独的线程调用RoInitialize(RO_INIT_MULTITHREADED)

Microsoft写入WinRT必须使用RO_INIT_多线程标志进行初始化。然而,我们的经验表明,使用其他标志也可以工作,但是所有WinRT事件都将同步执行。不适合工作

最后,如果您开发UWP应用程序,请不要忘记按此处所述设置应用程序设备功能:


这很重要。

最好将m_watcher.ScanningMode=Active;在调用Start()之前

此外,如果您开发非UWP(经典)应用程序,您应该确保WinRT已正确初始化。由于WinRT是基于COM技术的,所以最好在对COM进行任何其他调用之前初始化WinRT。但是,一些基于任何框架的应用程序(例如,MFC、Delphi VCL或其他)可能会在内部使用自定义参数初始化COM。在这种情况下,最好从单独的线程调用RoInitialize(RO_INIT_MULTITHREADED)

Microsoft写入WinRT必须使用RO_INIT_多线程标志进行初始化。然而,我们的经验表明,使用其他标志也可以工作,但是所有WinRT事件都将同步执行。不适合工作

最后,如果您开发UWP应用程序,请不要忘记按此处所述设置应用程序设备功能:


这很重要。

m_watcher.ScanningMode=Active;在调用Start()之前,请尝试一下。没用。我认为处于默认状态的Watcher对象应该能够开始侦听广告包并通过回调报告它们。至少这似乎是C代码中的行为。而C++/WinRT应该使用相同的底层WRL对象,不管它是从C++/WinRT还是从C#实例化的。这取决于WinRT的初始化方式。如果您的应用程序在WinRT初始化之前初始化COM somhow,您可能会出现奇怪的行为..我怀疑这一点。用于在单线程单元中初始化COM的原始WinRT应用程序(在内部完成)。我编写了另一个程序,将COM显式初始化为多线程单元,并尝试了上述代码。我也有同样的错误。通过在线搜索,我发现这在早期的Windows版本中曾经是一个问题,显然在17xx版本中已经解决了,我现在是1803。除非这是一个回归。目前,我正在尝试使用CoInitializeSecurity()显式初始化COM安全性,看看这是否解决了问题。到目前为止还没有成功。哦,顺便说一句,如果你开发UWP应用程序,你必须指定设备功能(我完全忘记了这一点,因为我们通常使用经典的Win32应用程序)。您可以在那里找到更多信息:m_watcher.ScanningMode=Active;在调用Start()之前,请尝试一下。没用。我认为处于默认状态的Watcher对象应该能够开始侦听广告包并通过回调报告它们。至少这似乎是C代码中的行为。而C++/WinRT应该使用相同的底层WRL对象,不管它是从C++/WinRT还是从C#实例化的。这取决于WinRT的初始化方式。如果您的应用程序在WinRT初始化之前初始化COM somhow,您可能会出现奇怪的行为..我怀疑这一点。用于在单线程单元中初始化COM的原始WinRT应用程序(在内部完成)。我编写了另一个程序,将COM显式初始化为多线程单元,并尝试了上述代码。我也有同样的错误。通过在线搜索,我发现这在早期的Windows版本中曾经是一个问题,显然在17xx版本中已经解决了,我现在是1803。除非这是一个回归。目前,我正在尝试使用CoInitializeSecurity()显式初始化COM安全性,看看这是否解决了问题。到目前为止还没有成功。哦,顺便说一句,如果你开发UWP应用程序,你必须指定设备功能(我完全忘记了这一点,因为我们通常使用经典的Win32应用程序)。你可以在那里找到更多:我不知道他们为什么否决这一评论。它解决了我的问题。谢谢你,乔。我不知道他们为什么否决这一评论。它解决了我的问题。谢谢你,乔。向上的