问题标签 [winrt-component]

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 回答
470 浏览

windows-runtime - 如何摆脱cppwinrt头文件中过多的参数警告C4002

在以下情况下,我收到太多参数警告。我可以将其报告为错误,但 GitHub 中的存储库已关闭,并且 cpp-winrt 项目现在归 Microsoft 所有。

情况 使用 cpp-winrt 项目模板新建一个 windows 运行时组件项目。在项目设置的c++->预处理器部分的“预处理器定义”中添加宏“WINAPI_PARTITION_DESKTOP”。编译项目。

您将收到以下警告:

...\生成的文件\winrt\impl\windows.ui.xaml.media.animation.0.h(4510):警告 C4002:函数式宏调用“GetCurrentTime”的参数过多

与上述消息对应的行是“virtual int32_t __stdcall GetCurrentTime(int64_t*) noexcept = 0;”

可能名称 GetCurrentTime 可能与 Windows 旧 API 名称冲突!

0 投票
1 回答
339 浏览

visual-c++ - 如何在 cpp-winrt idl 文件和普通/标准 cpp 类中使用相同的命名空间名称?

该场景是新的,我相信它可能是 cpp-winrt 模块或 vc 编译器中的错误。

问题
1. 使用通用 windows 的 cpp-winrt 模板创建一个“windows 运行时组件”。
2. 记下 idl 文件中定义的命名空间名称。默认情况下,idl 文件被命名为 class.idl。
3. 使用类向导将“新标准 cpp 类”添加到项目中。
4. 将新类放在 idl 文件中定义的相同命名空间名称下。
5. 构建项目。
一个。构建应该成功。
6.在运行时实现类中使用标准的cpp类。
7. 现在再次尝试构建项目。
一个。这次构建将失败。

原因
1. cppwinrt.exe 从 idl 文件生成源文件。
2.运行时实现类命名空间以“winrt”为前缀。
3.标准的cpp类不以命名空间“winrt”为前缀。
4. vc 编译器期望标准 cpp 类命名空间从“winrt”开始
5.否则即使您尝试使用完全限定的命名空间名称,名称解析也会失败。

示例运行时 idl 文件

示例标准 cpp 文件

示例运行时类实现

NMLevel1::NMLevel2::StdCPPClass stdcls; 不允许在命名空间前加上 winrt 前缀。

这是无法克服的错误还是设计限制?或如何在 idl 和 cpp 文件中使用相同的命名空间“NMLevel1::NMLevel2”?

0 投票
1 回答
181 浏览

javascript - 无法在 JavaScript 中为 Windows.Web.Http.HttpClient 添加超时

我很难弄清楚如何使用通过 WinRT 提供的 Windows.Web.HttpClient 设置请求超时。我正在开发的应用程序是一个 JavaScript 类型的通用 Windows 应用程序。“客户端”,JavaScript 可以访问使用在 C# 中编程时通常会使用的各种命名空间。这些命名空间的成员可以像这样从 window 对象访问:

我将在下面发布的代码的目标是在应用程序重定向到 URL 之前对 URL 进行简单的可达性检查,以防有人想知道为什么我没有使用 JavaScript 中更标准的方法(例如:XMLHttpRequest ),这是因为 CORS 有时会失败这些请求。由于我在一家大公司工作,因此要求在任何地方添加适当的 access-control-allow-origin 标头并不容易,除此之外,我们还有测试人员正在侧向加载设备、运行代理等......

也就是说,尽管我能够找到与手头任务相关的文档,但这些示例都在 C# 中,而且我注意到并非 JavaScript 方面的所有内容都与该文档完全一致。

Stack Overflow 用户在这里提出了一个非常相似的问题,并且接受的解决方案是使用 CancellationTokenSource。然而,据我所知,这个问题的 C# 解决方案不适用于 JavaScript 方面,但我确实想出了一个接近解决方案,我可以使用 setTimeout 取消任务。请注意,为了便于阅读,我在这里编辑了一些代码行。

上面的代码本身似乎运行良好,但后来我注意到传递给回调函数(arg 命名响应)的参数不是我所期望的。我期望至少类似于 XHR 响应的东西,但我得到的似乎是任务的成功或错误响应。问题是,我确实需要获取状态代码和失败原因,以便为我们的报告记录它(该代码未说明)。

这是我的下一次(部分)尝试,显然,如果我等待响应,那么我实际上确实得到了一个与 XHR 响应足够相似的对象以用于该目的。但是,由于我在这里等待任务,所以我没有将它存储在变量中,以便在超时后可以取消它。

总之,我不认为设置超时阈值这样简单的事情会如此痛苦,但我一直无法找到这样做的方法。

0 投票
0 回答
590 浏览

uwp - C++/WinRT 无法从 'winrt::com_ptr 转换参数 1' 到 'winrt::array_view

我正在使用 C++/WinRT 为 uwp 创建一个 winrt 组件。我定义了一个类似自爆的运行时类,

然后cppwinrt编译器生成这样的代码,

winrt 组件已编译,但当另一个 UWP 应用(使用 C++/WinRT 编写)引用该组件时,该应用无法编译。

错误就像自爆,

让我感到困惑的是,可以编译一个 uwp 应用程序(用 C# 编写)。

简而言之,我只想替换 C++/CX 中的 Array。我找到了这个,这不是我想要的。我想知道的是如何在 MIDL 3.0 中定义字节数组的属性。我已经像上面那样尝试过,但似乎我不能像上面那样做。
那么有人可以帮我解决这个问题吗?

0 投票
1 回答
575 浏览

windows-runtime - 进程外 WinRT 组件 + runFullTrust?

我正在开发一个必须与后台进程进行广泛通信的 UWP 应用 (C++/WinRT)。不幸的是,后台进程必须保持完全信任的“Win32”进程。两者都打包在一个 MSIX 中。

出于性能和可编程性的原因,我的首选是将后台进程转换为进程外 WinRT 组件。应用服务是一种可能性,但并不理想。

我找到了许多通过 WRL 创建 OOP WinRT 组件的代码示例。但是,激活是通过 CoreApplication::RunWithActivationFactories() 执行的,(据我所知)需要一个 AppContainer。

我知道我可以在 Win32 进程中使用WinRT 组件。我可以创建一个吗?如果是这样,在 C++/WinRT 中激活会是什么样子?

0 投票
0 回答
316 浏览

uwp - 如何通过 c++/winrt 将模板化的 C++ API 投影到 WinRT?

我有一个预先存在的本机 C++ 库,我试图通过 C++/WinRT 运行时组件投影 API 来向 UWP 应用程序公开。我很难理解如何公开模板化函数。

对于以下示例 C++ 类:

这个例子显然很愚蠢;实际上,模板化工厂正在创建另一个特定于库的类型(不是std::vector),并且它是 ExampleClass 的成员是有原因的。

我希望create_a_vector通过在我的 IDL 和运行时组件中专门声明和实现它们来公开专业化的子集。例如,以下 IDL 将是理想的:

然后在每个版本的实现(在 C++/WinRT 中)中,CreateAVector我会根据需要在 WinRT 和 C++ 类型之间进行转换,并调用create_a_vector.

然后,使用 C# 代码可能看起来像这样:

目标 C# 示例代码中使用的语法似乎是合法的,实际上许多 WinRT API 都是模板化的(IVector<T>例如)。但是,我上面的 MIDL 语法无效,并且我没有找到任何关于如何通过 MIDL 和/或 WinRT/C++ 创建模板化 WinRT API 表面的文档。

这种将原生 C++ 库投影到 WinRT 中的方法是否可行?我是在叫错树了吗?

0 投票
0 回答
78 浏览

rust - 你如何使用 Rust 导航 winrt-rs

我正在尝试从以下位置使用 winrt-rs:

[ https://github.com/microsoft/winrt-rs][1]

但是,我没有使用 winrt 的经验,除了示例(扫雷)之外,没有太多信息(我已经能够找到)。所以,我想看看我如何才能正确地导航这个。我下载了存储库,但它似乎并没有真正显示模块以及它们是如何编写的。另外,在写作时,我似乎没有得到智能感知或文档示例。

所以,作为一个例子,我正在尝试做一个 MessageDialog。我发现以下行有效:

有了这一行,编译成功。但是,我似乎无法找到如何创建一个新对话框。

这个错误说,

^^^^^^^^^^^^^ 你的意思是MessageDialog { /* fields */ }

所以,我尝试使用“新”:

但这给出了另一个错误:

^^^ 函数或相关项目未在windows::ui::popups::MessageDialog

正如问题所暗示的,这里真正的问题不是如何创建 MessageDialog。相反,我想知道在哪里可以找到 winrt 模块的信息。

0 投票
1 回答
542 浏览

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

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

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

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

0 投票
1 回答
59 浏览

cordova - 如何在 Javascript UWP 应用程序中迭代 IMapView WinRT 对象?

我需要迭代 WinRT 类型的对象以取消注册我已成功注册的 UWP 后台任务。

我可以在 javascript 中访问此对象 BackgroundTaskRegistration.AllTask​​s,但我收到了一个 IMapView<Guid, BackgroundTask> 类型的 WinRT 集合,我无法对其进行迭代或访问。

注意:该解决方案是使用 Cordova 设置的,但我从 VS2017 手动连接了 WinRT。

任何想法表示赞赏!

0 投票
1 回答
57 浏览

c# - 我可以在 Xbox 游戏中设置等待用户云数据同步完成的保持点吗?

是否可以将启动保留编程到 Xbox 游戏包中,等待用户的云保存在继续之前同步?我有一个 HTML5 游戏包,我需要从 Xbox Live 加载保存数据,然后从本地存储(以 JSON 格式)读取以在启动时填充加载屏幕,并且我还必须考虑任何错误消息用户可能必须做出回应。同步完成后游戏本身就会启动(但显然要等到法律问题得到处理后,所以徽标飞溅、引擎品牌、扣押咨询以及可能的 FBI 和 ESRB 通知也必须考虑在内) . 如果它也有助于调查,那么当有一个活动会话时,数据会被正确保存,我可以成功地将它复制到本地应用程序存储中。另一方面,Xbox Live 副本,

我也没有在游戏文件中保存那么多数据——只有五个保存槽,不包括全局配置和用户设置。基本上,我试图将每个用户的存储空间保持在创建者项目的 64MB 上限以下(更不用说我最初对 ID@Xbox 的请求没有成功),我希望在我什至之前实现这一点敢重新提交。考虑到我通过 Bing 和 Google 请求收到的所有相互冲突的信息,这当然是有可能的。

我最接近的是以下代码,它主要基于 Microsoft Docs 示例。第一个块应该加载 Xbox 数据并将其复制到磁盘,为此我首先需要延迟:

这就是 HTML5 部分调用时应该读取数据的内容:

这是 WinRT 端的保存代码:

而且我最近刚刚将用户检测代码添加到主项目中。