问题标签 [cppwinrt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
269 浏览

c++ - 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?

我正在尝试在桌面应用程序中使用 C++/WinRT 枚举系统上的所有设备:

这篇 MSDN 文章指出:

如果未指定 DeviceInformationKind,或者您使用的方法未提供 DeviceInformationKind 参数,则默认种类为 DeviceInterface。

此 MSDN 文章将其System.Devices.InterfaceClassGuid列为.DeviceInterface

但是,DeviceInformation返回的所有对象FindAllAsync都没有System.Devices.InterfaceClassGuid属性。我在这里做错了什么?

0 投票
1 回答
136 浏览

windows-runtime - 是否可以为 Windows 运行时组件(C++/WinRT)添加版本?

我正在使用 C++/WinRT 开发 Windows 运行时组件。

我想知道是否可以为组件添加版本信息?

例如,如果我们想在遗留的 dll 文件中添加版本信息,我们只需在项目中添加一个 .rc 文件,dll 文件将包含版本信息。

我应该如何为 Windows 运行时组件执行此操作?

0 投票
1 回答
58 浏览

cppwinrt - 关于 CppWinRT 内部 3

的用例是composable_factory什么?它似乎与 相关m_outer,但我找不到任何调用它的代码(搜索了 cppwinrt 目录中的所有文件)。非常感谢!!!

0 投票
1 回答
90 浏览

c++ - 从 C++/CX 迁移到 C++/WinRT 时与标头和命名空间相关的错误

文件.h:

文件.cpp

我收到以下错误:

我从这里知道需要包含我们使用的每个命名空间的标头。我假设这个错误来自那里,也许这就是为什么 Visual Studio 无法解析来自 std::map 的查找,而是映射到来自 xtree.h 的查找。但我可能错了。我确实尝试将 std 作为命名空间,但这似乎不起作用,或者至少看起来我可能还需要一些东西。我应该包含哪些标头和/或命名空间才能解决此错误。

0 投票
1 回答
370 浏览

windows - 命名空间“winrt::Windows::Foundation::EventRegistrationToken”没有成员“EventRegistrationToken”

我正在使用 Windows SDK 版本 10.0.17763.0。基于https://docs.microsoft.com/en-us/uwp/api/windows.foundation.eventregistrationtoken,在 10.0.10240 中引入了 EventRegistrationToken。所以我很困惑为什么在尝试使用它时会出错。我也没有在我的 Windows.Foundation.h (10.0.17763) 中看到它的定义。

0 投票
1 回答
276 浏览

c++ - 获取系统语言 UWP C++/WinRT

我想在 C++/WinRT 应用程序中获取系统语言(不是输入语言,而是整个系统语言),但找不到这样做的方法。我用谷歌搜索,发现Unity这可以使用System.Globalization.CultureInfo.CurrentCulture结构来完成,这在 C++ 代码中不可用。有人熟悉这个吗?

0 投票
1 回答
601 浏览

cmake - CMake 中 midl.exe 和 cppwinrt.exe 的问题

这在某种程度上是如何使用 midlrt.exe 将 .idl 编译为 .winmd 的后续内容?

我的 CMakeLists.txt 中有这个。我的问题不是关于 CMake 逻辑,而是关于 midl 和 cppwinrt 命令的输出,以及随后的编译和链接错误。我怀疑我可能缺少一些命令行选项。

在 cppwinrt 命令中,我尝试了不同形式的 -ref [spec] 和 -pch 选项,但无论如何似乎都得到了相同的结果。这些是我遇到的问题:

  • MIDLRT 生成的头文件“MyClass.h”有几个问题:

    • 它#includes <windows.h>,最终#defines 为GetClassName 和GetCurrentTime 定义预处理器宏,这些宏会在具有这些名称的WinRT 函数中导致编译器错误。
    • 我花了几个小时来跟踪它并学习使用#define COM_NO_WINDOWS_H 进行编译以防止这种情况发生。
    • 它#includes WinRT References Contracts 目录而不是 Include 目录中不存在的 *.h 文件:
      • #include "C:\Program Files (x86)\Windows Kits\10\References\10.0.18362.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.h"
      • #include "C:\Program Files (x86)\Windows Kits\10\References\10.0.18362.0\Windows.Foundation.UniversalApiContract\8.0.0.0\Windows.Foundation.UniversalApiContract.h"
    • 所以我复制了这个文件并用 #include <winrt/Windows.Foundation.h> 替换了那些
  • CPPWINRT 生成#includes "MyNamespace.MyClass.h" 的"module.g.cpp",但不生成那个.h 文件。它确实会生成“MyNamespace/MyClass.h”(注意“/”而不是“.”),所以我创建了前一个 .h 并从中简单地#include 后一个 .h。

  • CPPWINRT 不会生成我在 Microsoft 示例中看到的所有基本标头。它只生成与 MyClass 直接相关的头文件——例如,定义模板基类 winrt::MyNamespace::implementation::MyClassT<>、包装器 winrt::MyNamespace::MyClass 等。

  • winrt::MyNamespace::factory_implementation::MyClass 未定义。MyClassT<> 在那里定义,但不是 MyClass。我从 Microsoft 示例中找到了一个范例并将其粘贴到:

  • 我收到了关于 CHECK_NS_PREFIX_STATE 定义不一致的编译器警告:在某些地方它是“总是”,而在其他地方它是“从不”。所以现在我#define MIDL_NS_PREFIX 和#define CHECK_NS_PREFIX_STATE="always"

现在构建通过编译器,但我在链接器中有未解析的外部符号。我认为这些东西应该在“winrt/base.h”中内联定义,但是 cppwinrt 没有导出这样的文件(正如我在 Microsoft 示例中看到的那样),系统目录中的等效文件只包含原型,而不包含身体:

我是否遗漏了一些简单的东西来解决所有这些与丢失、不完整和不正确的生成文件有关的问题?

0 投票
1 回答
232 浏览

windows-runtime - 与 winrt::impl::com_ref 相关的错误从 c++/cx 转换为 c++/winrt 时

在cppcx中,我曾经有这个:

当我尝试这样做以将此代码转换为 cppwinrt 时:

我收到以下错误:

错误(活动) E0312 不存在从“winrt::impl::com_refwinrt::hstring”到“wchar_t*”的合适的用户定义转换

我希望我会因为 try_as 而得到一个 winrt::hstring 并且我可以从中得到 .c_str() ,但我得到的是一个 winrt::impl::com_refwinrt::hstring 。我错过了什么?

0 投票
1 回答
189 浏览

windows-runtime - C2280 'winrt::hstring::hstring(std::nullptr_t)':试图引用已删除的函数

在 cppcx 中,我有这段代码:

我正在尝试像这样转换为 cppwinrt:

但我收到一个错误:

错误 C2280 'winrt::hstring::hstring(std::nullptr_t)':试图引用已删除的函数

这是我收到错误的函数和行:

看起来像 C++/CX 一样,我们可以通过执行该代码正在执行的 ClassName:typeId 来获取类的 typeid。所以有一个 TypeName 构造函数将它作为参数。但是在 cppwinrt 中更改为结构后,它需要两个结构变量的初始值设定项。我不确定如何处理这个问题,尤其是这段代码中的 ref 类,由于目前缺乏对 idls 的支持,我的代码库还没有准备好移植到 cppwinrt。所以我决定只使用 cppcx 代码,但使用辅助函数来转换它们,但在转换时会遇到这个错误。

但是,如果我将方法更改为这样的:

它构建良好。

0 投票
1 回答
542 浏览

c++ - 在 C++/WinRT 组件中对 COM-lite 对象使用智能指针有什么建议吗?

C++/WinRT 提供了 3 种类型的智能指针用于 COM 对象 - Microsoft::WRL::ComPtrcom_ptr和基于 ATL 的CComPtr.

在我的例子中,它是一个 COM-lite 对象,这意味着它不是进程内或进程外 COM 对象,它是作为 C++ 对象创建的。

在这种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?