问题标签 [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.
uwp - 在 C++/WinRT 中捕获 ContentDialog::ShowAsync 引发的异常
在 C++/CX 我有:
如果我创建并尝试显示两个对话框,结果 show() 被调用两次,ShowAsync 曾经抛出异常:
任何时候都只能打开一个 ContentDialog
我过去常常抓住并处理这个案子。当我将此代码转换为 C++/WinRT 时,根据我对转换规则的理解,有:
调用者看起来像这样:
我确实看到抛出了一个 Windows 异常,但不知何故它没有被我的代码捕获。
这是调用 ShowAsync() 的正确方法吗?我该如何处理这个异常?
uwp - 在从 c++/cx 移植到 c++/winrt 时实现 Windows 运行时接口以供本地使用时出错
更新:
根据 Ryan Shepherd 的回复,我将代码更改为:
现在我得到一个错误:
没有构造函数实例 "winrt::implements<D, I, ...>::implements [with D=DerivedClass, I=BaseClass]" 匹配参数列表参数类型是:(winrt::Windows::UI:: Xaml::FrameworkElement)。
我确实定义了 BaseClass 构造函数,它将 &FrameworkElement 作为参数。所以我不确定我得到这个错误是什么。
原文:
我在 C++/CX 中有这个:
当我尝试将其转换为 c++/winrt
这里有几个问题我想讨论和理解。如上所述,我收到以下错误:
1
BaseClass 不是 DerivedClass 类的非静态数据成员或基类
2
winrt::implements<DerivedClass, BaseClass> 的默认构造函数不能被引用——它是一个被删除的函数
3
没有合适的用户定义从 winrt::impl::com_ref<DerivedClass> 到 DerivedClass 的转换
4
不存在从 std::nullptr_t 转换为 DerivedClass 的合适构造函数
希望对这些错误有一些想法。
我知道我创建了一个 DerivedClass 对象
问题:
- 如何正确编写构造函数?
- 如何像在 C++/CX 中那样将参数传递给基类构造函数?
- 如何处理 from() 函数定义中的错误。
uwp - 使用 winrt::implements 和 winrt::make 时出错
在 C++/WinRT 中,我手工编写了一些这样的类(不使用 idls):
我创建这样的对象:
对于派生自 winrt:implements<BackgroundControllerX, GenericController> 的每个类,我都收到以下错误:
这是输出日志:
看起来类的编写方式和对象的创建方式可能有问题。但我无法弄清楚是什么或为什么。
uwp - 将 comptr 设置为 winrt::UserControl::Tag() 时出错
更新: 我使用 Richard 的建议来修复 Tag 的设置。但是我在使用 getter for Tag 并在其上使用.as / try_as运算符时遇到了一些问题。
这是我得到的错误:
控制器是构造函数:
DerivedController 构造为:
DerivedController 在 c++/cx 中曾经是这样的:
不知道我做错了什么,错误似乎与类的定义方式有关。将不胜感激任何想法!
原文: 在 C++/CX 中,我曾经能够做到:
当我尝试将其转换为 C++/WinRT 时,直接转换如下:
Controller 是一个手工编写的类(没有 idls),其定义如下所示:
但我在 (1) 处收到错误:
- 是否可以使用与 ABI 的某些互操作将 Com 指针设置为 Tag?
- 还有什么我想念的吗?
- 这是正确的方法吗?或者有没有办法解决它?
windows-runtime - 我应该如何在 cppwinrt 中将 AddHandler 与 Handler 对象一起使用?
在 C++/WinRT 反射中,API AddHandler定义为
UIElement::AddHandler(Windows::UI::Xaml::RoutedEvent const& routedEvent, Windows::foundation::IInspectable const& handler, bool handledEventsToo) const
但是处理程序似乎只继承自IUnknown
. 例如,这是KeyEventHandler的声明:
struct KeyEventHandler : Windows::foundation::IUnknown
注册事件处理程序的解决方案是什么?
windows - bazel midl 规则生成的 c++ 头文件和 winmd 文件位于不同的文件夹中
当我使用 bazel 从 midl 文件生成 c++ 头源代码和 winmd 文件时,我发现 MyType.winmd 文件位于输出文件夹中,而 MyType.h 与源代码 MyType.idl 位于同一目录中。我想要的是我生成的头文件与 MyType.winmd 文件位于同一文件夹中。
我的类型.idl:
建造:
cmd.bzl:
midl.bat:
运行命令:
在此处生成 MyType.h:
生成的 MyType.winmd 在这里:
有什么我想念的吗?
visual-studio - C++/WinRT natvis 在全新安装中不起作用
我该如何解决这个问题?
我将这个问题中的 natvis 示例与 C++/WinRT 控制台模板结合起来,并成功地使 natvisMatrix2d
可以工作,但不能用于Uri
.
我不确定 cppwinrt 预计会生成哪些 natvis 文件(.natvis 或 .pdb)以及它们的位置。
下面是 Natvis 调试输出。它显示只有我的自定义 Natvis 文件 (\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis) 和系统范围的 Natvis 文件 (%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers) 正在加载。
Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\atlmfc.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\concurrency.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\cpp_rest.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\ObjectiveC.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis。Natvis: 解析 natvis xml 文件: C: \Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\Windows.Data.Json.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\windows.devices.geolocation.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\windows.devices.sensors.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\windows.media.natvis。Natvis:解析 natvis xml 文件:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\windows.natvis。Natvis: 解析 natvis xml 文件: C: \Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\winrt.natvis。Natvis:解析 natvis xml 文件:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis。Natvis:忽略来自 ConsoleApplication2.pdb 的 NatvisFile.natvis;加载的项目中已存在同名文件。Natvis:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(17,6):在类型上下文“Matrix2d”中成功解析表达式“0”。Natvis:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(18,6):在类型上下文“Matrix2d”中成功解析表达式“i < m_numRows”。Natvis:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1063,6):在类型上下文“std::vector<int,std::allocator >”中成功解析表达式“_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst”。Natvis:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1062,6):成功解析表达式'_Mypair._Myval2._Mylast - _Mypair._Myval2。 _Myfirst' 在类型上下文 'std::vector<int,std::allocator >' 中。Natvis:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1064,29):在类型上下文“std”中成功解析表达式“size()”: :vector<int,std::allocator >'。Natvis: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1066,52): 成功解析表达式' 类型上下文'std::vector<int,std::allocator >'中的容量()'。Natvis:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1067,53):在类型上下文“std::vector”中成功解析表达式“_Mypair” <int,std::分配器>'。Natvis:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1069,15):在类型上下文“std”中成功解析表达式“size()”: :vector<int,std::allocator >'。Natvis:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\Visualizers\stl.natvis(1070,23):在类型上下文中成功解析表达式 '_Mypair._Myval2._Myfirst' std::vector<int,std::allocator >'。纳特维斯:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(19,23):在类型上下文 'Matrix2d' 中成功解析表达式 '&m_elements[i * m_numCols],[m_numCols]na'。Natvis:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(19,8):在类型上下文“Matrix2d”中成功解析表达式“i”。Natvis:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(20,12):在类型上下文 'Matrix2d' 中成功解析表达式 '++i'。成功解析类型上下文“Matrix2d”中的表达式“i”。Natvis:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(20,12):在类型上下文“Matrix2d”中成功解析表达式“++i”。成功解析类型上下文“Matrix2d”中的表达式“i”。Natvis:C:\Users\a\source\repos\ConsoleApplication2\ConsoleApplication2\NatvisFile.natvis(20,12):在类型上下文“Matrix2d”中成功解析表达式“++i”。
这是全新安装的 Windows 10 和 VS19 (16.8.2)。
c++ - 从子类调用基类的受保护构造函数不起作用
我有一个需要子类化的 C++/WinRT 基类。我的问题是我无法从子类中调用基类的受保护构造函数。
该基类在 MIDL 中定义如下:
从中创建以下标头和实现:
子类的 MIDL、header 和 implementation 定义如下:
上面的例子编译。但是,如果我尝试从子类的初始化程序列表中调用受保护的基类构造函数,如下所示,我会收到编译器错误。
编译器错误如下:
error C2614: 'winrt::My::Custom::WindowsRuntimeComponent::implementation::SubClass': illegal member initialization: 'BaseClass' is not a base or member
在 MIDL 和 I 的标头中都SubClass
指定它继承自,BaseClass
因此我不清楚为什么编译器会发出该错误。
我想我可以解决这个问题,但我很好奇这里到底发生了什么。有什么提示吗?
c++ - UWP 的 AvSetMmThreadCharacteristicsW
我正在使用 cpp/winrt 开发 WASAPI UWP 音频应用程序,该应用程序需要从输入中获取音频并在处理后将其发送到输出。
我想用 设置我的音频线程特性AvSetMmThreadCharacteristicsW(L"Pro Audio", &taskIndex)
,但我只是注意到这个功能(和大部分avrt.h
)仅限于WINAPI_PARTITION_DESKTOP
和WINAPI_PARTITION_GAMES
。
我想我需要这个,因为当我的代码集成到我的 UWP 应用程序中时,音频输入充满了不连续性,我在使用avrt
API 的测试代码中没有问题。
还有另一种方法来配置我的线程以进行音频处理吗?
编辑:这是我的测试程序https://github.com/loics2/test-wasapi。有趣的部分发生在AudioStream
课堂上。我无法共享我的 UWP 应用,但我可以将这些类原样复制到 Windows 运行时组件中。
编辑 2:这是音频线程代码:
为了清楚起见,我删除了错误处理代码,其中大部分是:
uwp - 有没有办法在没有事件令牌的情况下删除 UWP 按钮单击处理程序?
在 UWP 应用程序中,有一个带有 Click handler( 1
) 的 Button。我想删除这个处理程序并添加我自己的处理程序。好像有2种方式:
1,我添加了一个假的handler( 2
),从返回的事件token中,我尝试猜测handler( 1
)对应的事件token,最后发现很难猜。
2,还是有一些API可以盲目删除Click处理程序?
非常感谢!