【问题标题】:Can a Qt 5.6 Desktop app (msvc 2015) use WinRT libraries (C++/CX)?Qt 5.6 桌面应用程序 (msvc 2015) 可以使用 WinRT 库 (C++/CX) 吗?
【发布时间】:2023-03-19 19:49:01
【问题描述】:

我已经在 QtCreator 和 Visual Studio 2015 中尝试过。我玩过不同的配置,据我所知,我已经正确设置了环境。

但是,每当我进行 API 调用(到目前为止,我只尝试 WiFi Direct 调用)并在发布模式下构建时,我都会收到此错误。

C2664   'long __winRT::__getActivationFactoryByPCWSTR(void *,Platform::Guid &,void **)': cannot convert argument 1 from 'const wchar_t [60]' to 'void *'

在调试中,我在 Visual Studio 2015 中遇到这些错误。

Error   LNK2038 mismatch detected for '_MSC_VER': value '1800' doesn't match value '1900' in main.obj qtmaind.lib(qtmain_win.obj)

Error   LNK2001 unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MainWindow::metaObject(void)const " (?metaObject@MainWindow@@UBEPBUQMetaObject@@XZ)   PROJECT     mainwindow.obj

Error   LNK2001 unresolved external symbol "public: virtual void * __thiscall MainWindow::qt_metacast(char const *)" (?qt_metacast@MainWindow@@UAEPAXPBD@Z) SSLocalServer   mainwindow.obj

Error   LNK2001 unresolved external symbol "public: virtual int __thiscall MainWindow::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MainWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z)    mainwindow.obj

Error   LNK2019 unresolved external symbol "__declspec(dllimport) char const * __cdecl std::_Winerror_map(int)" (__imp_?_Winerror_map@std@@YAPBDH@Z) referenced in function "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::_System_error_category::message(int)const " (?message@_System_error_category@std@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@H@Z) qtmaind.lib(qtmain_win.obj) 

先简单的问题。当前版本的 Qt 5.6 甚至可以在桌面应用程序中使用 WinRT API(特别是 WiFi Direct)吗?

如果是,我错过了什么?

编辑—— My test project. Qt 目录可能需要更改。

【问题讨论】:

  • 您确定您使用的 Qt 副本已使用您用于编译应用程序的同一编译器进行编译吗? This question 就是关于这个问题的。
  • 请添加重现问题的最小示例。确保包含完整的.pro 文件、完整的main.cpp(它应该是您拥有的唯一其他源文件)以及指向您的Qt 二进制文件副本的链接,或者您用来编译您的文件的configure 行Qt 的副本。
  • @KubaOber 测试项目已添加。我没有编译我自己的 Qt 版本。这是 5.6 的社区版本,它似乎使用不同版本的 msvc 编译了它的调试 msvc 2015 调试库。
  • 如果不自己编译,你会很难用 Qt 进行开发。我建议您这样做,否则很难重现此问题,因为这可能是包装问题,仅此而已。我没有使用任何预构建的 Qt,所以至少我自己无法测试它。
  • @KubaOber 编译我自己的 Qt 5.6.0 版本导致完全相同的错误。这使得 MSC_VER 错误完全没有意义,也让我觉得我缺少一些配置选项或 Qt 5.6 的一些配置导致了问题。

标签: visual-studio qt visual-c++ windows-runtime c++-cx


【解决方案1】:

MS 标头中的某些宏扩展错误并试图将错误的内容传递给__getActivationFactoryByPCWSTR。你需要弄清楚它为什么会发生。 Qt 桌面应用程序并不特别,它们就像任何其他桌面应用程序一样:如果任何桌面应用程序都可以使用这些 API,那么 Qt 桌面应用程序也可以。

唉,桌面应用程序只能使用subset 的 Windows 运行时 API。 Wifi Direct 未在此处列出。也许您应该改用桌面 WiFi 直接 API - 它们更便携。

【讨论】:

  • 感谢您的回答,但这有什么帮助?如果任何桌面应用程序都可以使用这些 API,为什么 Qt 会失败?有什么不同吗?这确实让我有一个想法,可以查看示例并查看项目中是否定义了我的项目中缺少的内容。
  • @Simurr Qt 在这方面不是一个东西。 Qt 可以对您的代码产生的唯一影响是通过项目配置(您的 .pro 或 cmake 文件)和用于正确构建 Qt 的 mkspecs。到目前为止我还没有看到这个问题。
  • Windows.Devices.WiFiDirect 命名空间可用于桌面应用程序(它只是包装了本机 Wi-Fi Direct functions)。要验证这一点,您可以选择任何类并检查 DualApiPartition 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多