WiFiDirectDevice::FromIdAsync 抛出 Win32 控制台应用程序
WiFiDirectDevice::FromIdAsync throws in Win32 Console App
我正在尝试使用 Windows 10 SDK 中的 WiFiDirect API 并在 Win32 控制台应用程序中实施连接器方案。我已经在基本控制台应用程序中启用了 C++/CX,并集成了来自 Microsoft's example on GitHub.
的代码现在我可以成功发现设备,如果设备已经配对,甚至可以连接和传输数据。但是,当我尝试从头开始将它们配对时,FromIdAsync 任务以已取消结束,下面的最后一行抛出一个异常,指出 "The remote procedure call failed."
WiFiDirectConnectionParameters^ connectionParams = ref new WiFiDirectConnectionParameters();
connectionParams->GroupOwnerIntent = (short)(wcstoul(txtGOIntent->Text->Data(), nullptr, 10));
// IMPORTANT: FromIdAsync needs to be called from the UI thread
concurrency::task<WiFiDirectDevice^> fromIdTask(WiFiDirectDevice::FromIdAsync(discoveredDevice->DeviceInfo->Id, connectionParams));
fromIdTask.then([this](concurrency::task<WiFiDirectDevice^> fromIdResultTask)
{
try
{
WiFiDirectDevice^ wfdDevice = fromIdResultTask.get();
我认为它无法显示带有 PIN 输入的弹出窗口,但如何克服这个问题?
我在做完全相同的事情时遇到了同样的问题,但在 C# 而不是 C++ 中。缺少关于 WiFiDirectDevice
的文档有点让人恼火,但我发现了类似的东西 in a relatively similar class remarks,说 FromIdAsync
需要从 UI 线程调用才能显示同意提示(正如你我所怀疑的那样)。
出于某种原因,Microsoft 认为强制开发人员依赖特定 UI 框架以使用 WiFiDirect 是个好主意。但是,这似乎只是第一次是强制性的,因为正如您已经实现的那样,一旦两个设备相互信任,就可以通过命令行应用程序进行连接。所以也许 "connect two devices" 简单的应用程序就可以完成工作。
测试此行为被证明是困难的:受信任的设备列在 Settings > Privacy > Other devices
下,但取消选中另一台计算机只会使尝试连接的应用程序(而不是通告它的应用程序)失败,而不是请求再次获得许可,并且没有 "forget this device" 这样的东西来再次显示同意提示。
编辑:似乎如果您使用“控制面板”中的“设备和打印机”菜单将一台设备从另一台设备上删除,您必须在另一台计算机上执行完全相同的操作,否则您将得到描述性异常Element not found
在广告商机器上执行 FromIdAsync
时。
编辑 2:运行 WPF 应用程序 UI 线程上的 FromIdAsync
也不起作用(在 Remote procedure call failed
异常中再次重新使用),这让我觉得它试图调用某些 Store 其他类型的应用程序不可用的特定功能。微软将 WiFiDirect 如此惊人的功能像这样与他们的通用应用程序平台绑定在一起,真是令人难过。
编辑 3:我看到您将另一个答案标记为正确。您能否分享 Windows 10 Threshold 2 似乎提供的解决方案?我还找不到解决方法。
[更新] TH2 已经推出一段时间了,所以 custom device pairing API is what I was alluding to originally. There is a SDK sample 也向您展示了如何使用它。签出示例中的场景 9。
明确地说,您可以通过 3-4 种方式在应用中配对设备:
- 使用设备选择器控件,可以内联配对设备
- 使用简单配对API。如前所述,它必须在应用程序 UI 线程上调用,因为 shell 可能无法弄清楚在哪里绘制应用程序模式对话框,否则
- 使用自定义设备配对API
- 使用入站配对API(仅适用于物联网设备上的蓝牙)
Windows.Devices.Enumeration* 中的大多数 APIs 被认为是 "dual" APIs,这意味着它们在应用程序容器和中等 IL win32 类型中工作过程。例外情况是生成 UI 的 API(即 #1 和 #2),因此在您的场景中,只有 #3 可以在桌面控制台应用程序中使用。
在 TH2 之前,上面的 #2 会隐式发生。 RPC 调用失败,因为控制台应用程序不在应用程序容器中,因此 shell 无法注入模态对话框。
[原始回复] 显然这是一个应该可行的方案。您应该在 Threshold 2 中使用 WiFiDirect WinRT APIs 寻找对 win32 应用程序更好的支持,它很快就会发布给所有人。您现在可以尝试使用 Windows 10 的飞行内幕版本。我认为您问题中的场景应该有效。
我建议您在 TH2 SDK 发布时查看它。查看是否有新的 API 可以解决您的问题。发货后请联系我,我可以为您提供有关如何管理 WFD 配对的更多详细信息。