0

在 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, ...));

它构建良好。

4

1 回答 1

0

如果您可以通过 winmd 获得 C++/CX 类的投影,那么这将很容易。假设您不能这样做,您需要从 C++/CXTypeName转换为 C++/WinRT TypeName。basicfrom_cx不会那样做,因为TypeName它是一个结构,而不是运行时类,但是添加重载from_cx来处理TypeName结构很简单,并且hstring它拥有。

winrt::hstring from_cx(Platform::String^ const& from)
{
  winrt::hstring to;
  const HSTRING& fromHstring = reinterpret_cast<HSTRING>(from);
  winrt::copy_from_abi(to, fromHstring);
  return to;
}

winrt::Windows::UI::Xaml::Interop::TypeName from_cx(::Windows::UI::Interop::TypeName const& from)
{
  return {
    static_cast<winrt::Windows::UI::Xaml::Interop::TypeKind>(from.Kind),
    from_cx(from.Name)
  };
}
于 2020-09-10T07:21:54.470 回答