问题标签 [c++-winrt]

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 投票
0 回答
100 浏览

side-by-side - 是否可以拥有 C++/WinRT 组件的并行版本

参考 Microsoft Build 2018 大会的视频: https ://medius.studios.ms/Embed/Video/BRK2425?sid=BRK2425

我们看到新的 IDL 版本 3 中没有 GUID。这是否可以让同一组件有 2 个不同版本,比如说在同一台计算机上的两个不同文件夹中,并让它们同时工作?考虑以下目录结构:

  • C:\
    • 应用v1
      • 客户端应用程序
      • mywinrtcomponent.dll
      • mywinrtcomponent.winmd
    • 应用v2
      • 不同的clientapp.exe
      • mywinrtcomponent.dll
      • mywinrtcomponent.winmd

两个 exe 都会使用它们旁边的 DLL,还是有像 COM 对象这样的注册机制?

我知道 COM 组件不可能,因为如果它们具有相同的类型 ID (guid),则只能为其注册一个 DLL,最后注册的 DLL 获胜。

所以我想我可以将我的问题重新表述为“如何解决使用 c++-winrt 组件的客户端应用程序的依赖关系?” 如果它只是普通的类似 COM 对象,那么我知道不可能有两个不同的版本,但如果它使用常规 LoadDLL() 加载 DLL 并首先搜索当前文件夹,这是可能的。

0 投票
1 回答
141 浏览

c++-winrt - 如何在 C++/WinRT 组件中自定义 PCH 文件的名称?

在 Visual Studio 中使用Windows Runtime Component (C++/WinRT)模板时,会生成一个名为的文件module.g.cpp,该文件使用硬编码的预编译头文件名:pch.h. 如果我想使用不同的名称,有没有办法自定义它?如果没有,这可以在未来的版本中完成cppwinrt.exe吗?

我还遇到了一个不同的线程,其中提到了类似的限制,但针对 XAML 编译器。也许这两种工具都应该为此提供一个开关。

0 投票
1 回答
166 浏览

uwp - IHttpFilter 实现导致 HttpClient::GetStringAsync 调用的访问冲突

我正在将 OAuth 身份验证分解为IHttpFilter以与HttpClient一起使用。我正在使用以下代码进行测试,期望它将所有请求简单地转发到HttpBaseProtocolFilter

过滤器链已正确创建,并传递给HttpClientc'tor。发出GetStringAsync调用时,代码内部崩溃TestHttpFilter::SendRequestAsync并出现以下错误:

put_abi这看起来是在 SDK 头文件<Windows.Web.Http.Filters.h>内的调用中取消引用的 NULL 指针(为简洁起见,省略了命名空间):

我不明白,我哪里做错了。我希望通过回答以下问题来深入了解它的核心:

  • 执行有什么问题TestHttpFilter吗?
  • HTTP过滤器可以与HttpClient(例如)的便捷实现一起使用,还是我们在使用过滤器时GetStringAsync需要通过接口?SendRequestAsync
  • 极不可能,但这可能是生成的 SDK 标头的问题,为本地operation对象选择了不合适的 c'tor?

我可以使用官方 Windows SDK 版本 10.0.17134.0 重现该问题。

0 投票
1 回答
142 浏览

windows - 为什么 `agile_ref` 会因某些对象(例如 `CoreWindow`)而失败?

C++/WinRTagile_ref应该允许以敏捷的方式使用非敏捷对象。但是,我发现这至少在CoreWindow实例中失败了。

作为一个简短的例子:

Run()在 UI 线程上调用,然后尝试创建一个敏捷引用,然后使用它CoreWindow从线程池中调用。但是,这失败了,"The application called an interface that was marshaled for a different thread."因为agile_ref使用RoGetAgileReference内部编组对象,并且创建引用然后解组它的调用都成功了,在我看来,这似乎CoreWindow只是拒绝被编组。

当然,除非这是按预期工作并且RoGetAgileReference调用默默地无法编组CoreWindow.

那么是什么导致SetPointerCapture调用失败,即使使用agile_ref?

0 投票
1 回答
513 浏览

windows-runtime - 如何获取UTC的当前时间?

我正在尝试在 UWP 应用程序中获取 UTC 的当前时间。这应该是构造一个DateTime对象的简单问题

并访问其UniversalTime字段。但是,该字段似乎并未投影到 C++/WinRT 中。

如何使用 C++/WinRT 获取 UTC 的当前时间?

0 投票
1 回答
3747 浏览

multithreading - 用于更新 MFC 应用程序窗口的 C++11 线程。需要 SendMessage()、PostMessage() 吗?

在使用 C++/CX 和 ++/WinRT 的简单 UWP 应用程序花费了一些时间之后,我开始享受一些针对 Windows UI 应用程序开发的环境的功能。

现在不得不回到更熟悉的 MFC 应用程序开发,我想将我的方法更改为类似于 UWP 应用程序开发的方法。这个想法是使用异步 C++11 线程来生成内容并修改在 MFC UI 中显示的内容。

我想做的主要改变是使用 C++11 线程来卸载一些耗时的任务,并让这些线程将结果传达回主 MFC UI。

我希望卸载到 C++11 线程上的一些任务,类似于我在 UWP 应用程序中使用 C++/CX 和 C++/WinRT 处理异步任务时使用的任务:

  • 连接到另一台计算机并与之交换数据
  • 打开一个数据文件并解析它以更新 UI 视图
  • 将数据文件转换为另一种格式,例如 CSV 并导出到文件
  • 读取 CSV 等格式的文件并将内容转换为数据文件
  • 在 UI 中执行数据文件呈现的搜索和过滤

我遇到的问题类似于我可以在 MFC 中有多个 GUI 线程吗?,但是,我正在寻找一种通用方法,而不是该问题中的特定进度条更新。

我一直在尝试使用 Visual Studio 模板对实验性 MFC 应用程序进行简单测试,该模板具有停靠在左侧的树控件以在工作线程中构建树。

如果我有一个CViewTree显示树视图的 MFC 窗口,我想从 C++11 线程更新它,我目前正在使用::PostMessage()它来请求更新停靠窗格中的树控件。

如果我使用具有全局变量的 lambda,std::thread例如以下代码:

MFC 停靠窗格的消息处理程序,如下所示:

确实使用树控件内容更新 MFC 停靠窗格,就像在AddItemsToPane(m_wndClassView);创建 C++11 线程的同一位置调用该函数一样。当 C++11 线程仅用于提供线程方法实际工作的可见指示时,窗格更新延迟 5 秒。

我的问题是我希望 C++11 线程为树控件创建内容并将其提供给停靠窗格,而不是让停靠窗格生成内容。

到目前为止,我能想到的唯一方法是开发自己的类库,该类库将为 MFC 库和控件提供 C++11 线程类似物,::PostMessage()用于将适当的 Windows 消息发送到指定的 MFC 窗口或控件。

我想知道是否可以让 C++11 线程拥有它们自己更新的阴影 MFC 控件,然后向 UI 发送一条消息,要求 UI 使用阴影 MFC 控件的内容更新其显示的控件?还是人们正在使用其他方法?

我正在寻找其他一些不那么费力的方法来解决从 C++11 线程更新 MFC UI 的问题。

顺便说一句,#1 ::SendMessage()似乎死锁了join()CClassView::OnNewFolder()我认为这意味着 C+11 线程和 UI 线程之间的某种同步正在阻止 C++11 线程到达它的一侧join()

是的,当消息处理程序在等待线程完成时,线程等待SendMessage()返回时存在死锁join()。根据Windows 开发中心 SendMessage 功能

将指定的消息发送到一个或多个窗口。该SendMessage 函数调用指定窗口的窗口过程并且在窗口过程处理完消息之前不返回

要发送消息并立即返回,请使用SendMessageCallback orSendNotifyMessage函数。要将消息发布到线程的消息队列并立即返回,请使用PostMessageorPostThreadMessage 函数。

顺便说一句#2似乎使用实际的 Window 句柄而不是thisC++11 线程的 lambda 中的指针会更安全。以防万一this指针由于某种原因变得未定义,例如控件被删除?

顺便说一下 #3通过 提供的 Microsoftconcurrency命名空间#include <ppltasks.h>是 C++11 线程的替代方案。concurrency命名空间函数比 C++11 线程具有更高的抽象级别,并且更易于使用。

例如,上面的使用std:thread可以重写为:

这不需要使用 astd::thread join()来干净地终止线程。也SendMessage()可以PostMessage()用于发送 Windows 消息,因为我们没有与 C++11 线程相同的死锁问题。

笔记

注意#1: 关于消息和消息队列以及使用消息和消息队列

有关 MFC 特定内容,请参阅框架中的消息和命令

Note #2: Multithreading with C++ and MFC , 特别是Multithreading: Programming Tips其中说。

如果您有一个多线程应用程序,该应用程序使用 CWinThread 对象以外的方式创建线程,则您无法从该线程访问其他 MFC 对象。换句话说,如果要从辅助线程访问任何 MFC 对象,则必须使用多线程:创建用户界面线程或多线程:创建工作线程中描述的方法之一创建该线程。这些方法是唯一允许类库初始化处理多线程应用程序所需的内部变量的方法。

注意 #3: 可从经典桌面应用程序调用的 UWP API说:

除了一些值得注意的例外,一般规则是可以从经典桌面应用程序调用通用 Windows 平台 (UWP) API。作为此一般规则例外的两个主要 API 领域是 XAML UI API 和要求调用应用程序具有包标识的 API。UWP 应用具有定义明确的应用模型,并且它们具有包标识。经典桌面应用没有明确定义的应用模型,也没有包标识。已转换为 UWP 应用的经典桌面应用确实具有包标识。

另请参阅 2012 年 9 月关于 WinRT 与 VS 2012 和 Windows 8 的以下博客。虽然 C++/WinRT 与 VS 2017 似乎比使用的 Windows 运行时模板库 (WRL) 更适合 Windows 10:

注意#4: MFC 桌面应用程序是一个有很多链接的起点。另请参阅MFC COM,这是一个起点,其中包含许多关于 MFC 和 COM 的链接以及这篇文章COM 简介。另请参阅MFC 宏和全局

至于使用AfxGetMainWnd()获取主应用程序窗口,微软开发者中心在文章AfxGetMainWnd中有这样的说法:

如果从应用程序的主线程调用 AfxGetMainWnd,它会根据上述规则返回应用程序的主窗口。如果从应用程序中的辅助线程调用该函数,则该函数返回与进行调用的线程关联的主窗口。

0 投票
2 回答
993 浏览

c++ - ERROR_ACCESS_DENIED while using BluetoothLEAdvertisementWatcher in C++/WinRT

I'm trying to use BluetoothLEAdvertisementWatcher to detect BLE advertising packets. However upon calling Start() the watcher object always aborts with 'Access is denied' error.

Code is pretty simple and is as below:

m_watcher is a class member declared as:

The event handlers are declared as:

This code is pretty similar to the sample code in the SDK which is in C#. I'm trying to do the same in C++ as I'm more familiar with it.

Any idea what could be going wrong? I tried removing all the filters, that is, using the watcher in its default state. That too gives the same error. Removing the event handlers also results in the same error.

Thanks in advance.

EDIT: Changed the title adding ERROR_ACCESS_DENIED.

EDIT2: The exact location where the error occurs is: onecoreuap\drivers\wdm\bluetooth\user\winrt\advertisement\bluetoothleadvertisementwatcher.cpp(1510)\Windows.Devices.Bluetooth.dll!0F479314: (caller: 0F47AD40) Exception(2) tid(2c1c) 80070005 Access is denied.

0 投票
1 回答
852 浏览

c++-winrt - 如何在 winrt::impl::blocking_suspend 中解决断言 WINRT_ASSERT(!is_sta())

我有一个 Win32 DLL,我正在尝试将其转换为可从 UWP 使用。我需要将文件处理代码(CreateFile、ReadFile 等)替换为 WinRT 安全等效项(Windows::Storage::StorageFile)。我已经转换和编译了代码,但是当我运行应用程序时,我在返回的异步操作上调用 get 这个异常,我不知道如何解决这个问题。

0 投票
1 回答
827 浏览

directx-11 - C++-WinRT 的 com_ptr 重置?

我正在尝试将 DirectX11/XAML UWP 模板移植到 C++-WinRT 版本......其中一切都通过 C++-WinRT 完成,我可以关闭 CX。

我目前被困在如何ResizeBuffers使用交换链。我不断收到错误消息,提示我尚未释放所有缓冲区引用。如果我注释掉与调整缓冲区大小有关的任何内容并且只是硬编码某个大小,则该应用程序可以正常工作。所以......我可能做错了什么。

我相信这与新的winrt::com_ptr. ResetWRL ComPtr 上没有类似的方法。我已将它们设置为nullptr就像在原始 C++/CX 模板中一样,但这似乎还不够。

我必须做的其他事情可能会影响正在发生的事情:

  1. DeviceResources 类现在是一个 C++/WinRT 类,我默认使用 nullptr_t 参数在所有其他类(SampleScene3DRenderer、DirectXPage 和 Main)中创建它。这样,我可以在 DirectXPage 中创建它,传入 swapChainPanel 引用,然后将这个 DeviceResources 实例传递给我创建的所有其他类。

  2. 在 DirectX 初始化中有一个地方你必须传入一个**IUnknown. C++/WinRT 的文档提到使用调用函数winrt::get_unknown来返回*IUnknown. 我无法让它适用于以下DWriteCreateFactory方法,所以我尝试了这种方式:

    /li>

我不确定还能做什么。只有交换链调整大小不起作用。我在PC(不是Windows Phone)上这样做。

0 投票
1 回答
991 浏览

uwp - 如何在代码中创建 XAML 自定义控件?

我正在尝试使用 C++/WinRT 在代码中实现自定义 XAML 控件。但是,我尝试的实现未能编译。作为概念证明,我使用了以下代码:

这导致以下编译器错误:

我无法理解编译器错误。显然,您无法像实现其他类型以供 Windows 运行时使用一样实现 XAML 控件。

在代码中实现 XAML 自定义控件需要什么?