我可以从 Qt 应用程序访问哪种类型的 WinRT API?

Posted

技术标签:

【中文标题】我可以从 Qt 应用程序访问哪种类型的 WinRT API?【英文标题】:What type of WinRT API do I have access to from Qt app? 【发布时间】:2015-09-11 10:07:58 【问题描述】:

我在 Windows 10 上使用 Qt 5.6 Alpha WinRT 端口,并希望从 Qt 应用程序访问 WinRT 的 Wifi Direct API。

我知道应该使用 WRL。但是我在我的应用程序中使用 Wifi Direct API 并尝试来自Microsoft's GitHub repository 的 Windows 通用示例得到不同的行为。更具体地说,我在尝试激活 WiFiDirectDevice 时得到 E_NOTIMPL,而 Microsoft 的示例工作正常。

HStringReference strDevice(RuntimeClass_Windows_Devices_WiFiDirect_WiFiDirectDevice);

ComPtr<IInspectable> insp;
hr = RoActivateInstance(strDevice.Get(), insp.GetAddressOf());

所以我对我从 Qt 应用程序调用什么类型的 API(Windows 商店或桌面)感到困惑?

【问题讨论】:

报错很准确,这个真的没有实现。您必须使用工厂函数 FromIdAsync() 创建实例。在示例代码中得到了很好的演示。当你写一点 C++/CX 代码时,你可能会更快地陷入成功的深渊。 @HansPassant Qt 强烈建议使用 WRL。而且我没有找到任何关于如何在 Qt 应用程序中使用没有 ABI 命名空间的 C++/CX 和 API 的信息。是否有可能通过 WRL 实现这一目标? @HansPassant 我的意思是为了调用 FromIdAsync 我需要激活 IWifiDirectDeviceStatic 接口,它也会返回 E_NOTIMPL。而且我的 windows.devices.wifidirect.h 中没有工厂 @HansPassant 谢谢,切换到 C++/CX 成功了 【参考方案1】:

我会尽量回答自己,虽然我不是 100% 确定。

Qt's documentation 表示“Qt for WinRT 允许您在支持 Windows Store App API 的设备上运行 Qt 应用程序。”和“WinRT 应用程序在沙盒环境中运行...”

基于这一点,以及为 WinRT 单独的 Qt 端口与 Windows 桌面 Qt 执行相同工作的事实没有意义,我可以假设 Qt 端口创建 Windows Store 应用程序并使用 Windows Store API。

但如果有人证实这一点,我将不胜感激。

【讨论】:

你的假设是正确的。但大多数来自 Qt Desktop 的代码无需修改即可在 Qt WinRT 上运行。

以上是关于我可以从 Qt 应用程序访问哪种类型的 WinRT API?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 与 WinRT C++ 构建问题

WinRT app调用win32 c++ dll发送参数

WinRT C++ (Win10) 从 SoftwareBitmap / BitmapBuffer 访问字节

如何从托管项目中引用本机 WinRT 组件?

相当于C ++ / WinRT中的Platform :: IBoxArray

如何阅读winmd(WinRT的元数据文件)?