WiFiDirectDevice :: FromIdAsync引发Win32控制台应用程序

时间:2015-09-15 10:20:48

标签: windows-runtime wifi-direct c++-cx

我尝试使用Windows 10 SDK中的WiFiDirect API并在Win32控制台应用中实现连接器方案。我已经在基本的控制台应用中启用了C ++ / CX,并在Microsoft's example on GitHub中集成了代码。

现在,如果设备已经配对,我可以成功发现设备甚至连接和传输数据。但是,当我尝试从头开始配对时,FromIdAsync任务最终会被取消,而下面的最后一行会抛出一个异常,说明"远程过程调用失败。"

        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输入的弹出窗口,但是如何克服这个?

2 个答案:

答案 0 :(得分:1)

我在完成同样的事情时遇到了同样的问题,但是在C#而不是C ++中。缺少关于WiFiDirectDevice的文档有点令人愤怒,但我发现类似in a relatively similar class remarks的内容,说需要从UI线程调用FromIdAsync才能显示同意提示(当你我怀疑。)

出于某种原因,Microsoft认为强制开发人员依赖特定的UI框架以使用WiFiDirect是一个好主意。但是,这似乎只是第一次强制执行,因为正如您已经实现的那样,一旦两个设备相互信任就可以通过命令行应用程序进行连接。因此,“连接两个设备”简单的应用程序可以完成工作。

测试此行为很困难:Settings > Privacy > Other devices下列出了受信任的设备,但取消选中另一台计算机只会使尝试连接的应用程序(而不是宣传它的人)失败,而不是再次请求权限,并且没有“忘记此设备”以便再次显示同意提示。

编辑:似乎如果您使用“控制面板”中的“设备和打印机”菜单从另一台设备中删除一台设备,则必须在另一台计算机上执行完全相同的操作,否则您将获得描述性异常Element not found在广告客户计算机上执行FromIdAsync

编辑2:在WPF应用程序的UI线程上运行FromIdAsync也不起作用(在Remote procedure call failed异常中再次重新发送),这让我觉得它试图调用一些< em> Store 特定功能不适用于其他类型的应用程序。很遗憾,微软将像WiFiDirect这样的惊人功能与其通用应用平台联系起来。

编辑3:我看到你将另一个答案标记为正确。你能分享一下Windows 10 Threshold 2似乎提供的解决方案吗?我找不到一个解决方法。

答案 1 :(得分:1)

[更新] TH2已经停用了一段时间,所以custom device pairing API是我最初提到的。还有一个SDK sample,它会告诉您如何使用它。样本中的结帐方案9。

要清楚,您可以通过3-4种方式在应用中配对设备:

  1. 使用设备选择器控件,它可以内联设备
  2. 使用简单配对API。如上所述,它必须在应用程序UI线程上调用,因为shell可能无法确定在哪里绘制应用程序模式对话框否则
  3. 使用自定义设备配对API
  4. 使用入站配对API(仅适用于物联网设备上的蓝牙)
  5. Windows.Devices.Enumeration *中的大多数API都被视为“双重”API,这意味着它们可以在应用程序容器以及中型IL win32类型进程中运行。例外情况是生成UI的API(即#1,&amp;#2),因此在您的方案中,只有#3可以在桌面控制台应用程序中运行。

    在TH2之前,上面的#2会隐含发生。 RPC调用失败,因为控制台应用程序不在应用程序容器中,因此shell无法注入模式对话框。

    [原始回复]显然这是一个应该有效的方案。您应该在Threshold 2中使用WiFiDirect WinRT API寻找对win32应用程序的更好支持,该版本即将发布给所有人。您现在可以使用Windows 10的内置构建版本来尝试它。我认为您的问题中的场景应该正常工作。

    我建议每当它出来时检查TH2 SDK。检查是否有新的API可以解决您的问题。发货后请给我打电话,我可以为您提供有关如何管理WFD配对的更多详细信息。