【发布时间】:2020-12-20 17:33:31
【问题描述】:
在cppcx中,我有这段代码:
auto frame = ref new Frame();
frame->Navigate(TypeName(CppCxInternalRefClass::typeid), ref new AnotherCppCxInternalRefClass(a, b, c,
...));
我正在尝试像这样转换为 cppwinrt:
Frame frame;
frame.Navigate(
utils::from_cx<winrt::TypeName>(TypeName(CppCxInternalRefClass::typeid)),
utils::from_cx<winrt::Windows::UI::Xaml::FrameworkElement>(
ref new AnotherCppCxInternalRefClass(a, b, c,
...)));
但我收到一个错误:
错误 C2280 'winrt::hstring::hstring(std::nullptr_t)':试图 引用已删除的函数
这是我得到错误的函数和行:
template <typename T>
T from_cx(Platform::Object ^ from) {
===>T to{nullptr};
winrt::guid iid = winrt::guid_of<T>();
winrt::check_hresult(reinterpret_cast<::IUnknown*>(from)->QueryInterface(
reinterpret_cast<GUID&>(iid), reinterpret_cast<void**>(winrt::put_abi(to))));
return to;
看起来像 C++/CX 一样,我们可以通过执行代码正在执行的 ClassName:typeId 来获取类的 typeid。所以有一个 TypeName 构造函数将它作为参数。但是在 cppwinrt 中更改为结构后,它需要两个结构变量的初始值设定项。我不确定如何处理这个问题,尤其是这段代码中的 ref 类,由于目前缺乏对 idls 的支持,我的代码库还没有准备好移植到 cppwinrt。所以我决定只使用 cppcx 代码但使用辅助函数来转换它们,但是在转换时会遇到这个错误。
但是,如果我将方法更改为这样的:
auto cppCxFrame = utils::to_cx<Frame>(frame);
cppCxFrame->Navigate(TypeName(CppCxInternalRefClass::typeid),
ref new AnotherCppCxInternalRefClass(a, b, c, ...));
它构建得很好。
【问题讨论】:
-
您可能正在寻找xaml_typename 函数模板。
-
我的理解是winrt类型的。 InternalRefClass 和 AnotherInternalRefClass 是 c++/cx 引用类,尚未转换为 winrt 类。
-
我想说的是 Internal ref 类和 AnotherInternalRefClass 是 C++/CX 风格的 ref 类。我正在尝试在不更改 ref 类的情况下将使用它的代码转换为 c++/winrt。我也更新了描述。
-
您的意思是要在 C++/CX 项目中实现从 C++/CX 到 C++/WinRT 的转换吗?有关 C++/CX 和 C++/WinRT 之间转换的更多信息,您可以参考此document。另外,根据您的描述,目前您可以成功构建项目吧?
-
我有一个解决方法,我将框架转换为 CX 对象并在其上调用导航。但如果我能让这条线工作会更干净: utils::from_cx<:typename>(TypeName(CppCxInternalRefClass::typeid))
标签: windows-runtime uwp-xaml c++-cx c++-winrt cppwinrt