【问题标题】:error related to winrt::impl::com_ref<winrt::hstring> when converting from c++/cx to c++/winrt从 c++/cx 转换为 c++/winrt 时与 winrt::impl::com_ref<winrt::hstring> 相关的错误
【发布时间】:2020-12-17 16:58:22
【问题描述】:

在cppcx,我曾经有过这样的:

auto button = safe_cast<ContentControl ^>(obj);
if (auto text = dynamic_cast<Platform::String^>(button->Content)) {
    return text->Data();
}

当我尝试这样做以将此代码转换为 cppwinrt 时:

auto button = obj.as<winrt::ContentControl>();
if (auto text = button.Content().try_as<winrt::hstring>()) {
    return text.c_str();
}

我收到以下错误:

错误(活动)E0312 不存在从“winrt::impl::com_refwinrt::hstring”到“wchar_t*”的合适的用户定义转换

我希望我能通过 try_as 获得一个 winrt::hstring,并且我可以从中获得 .c_str(),但我得到的是一个 winrt::impl::com_refwinrt::hstring。我错过了什么?

【问题讨论】:

  • 谢天谢地,库只是阻止你返回一个悬空指针。
  • 没有办法解决吗?

标签: windows-runtime uwp-xaml c++-winrt cppwinrt


【解决方案1】:

您似乎想在IInspectable 接口后面拆箱一个标量值(请参阅Boxing and unboxing scalar values to IInspectable with C++/WinRT)。对于拆箱,您需要使用 unbox_value 函数模板:

auto button = obj.as<winrt::ContentControl>();
if (auto text = unbox_value<winrt::hstring>(button.Content())) {
    return text.c_str();
}

虽然值得怀疑,但您是否真的想要返回一个指向其他地方拥有的某些数据中间的指针。最好只按值返回hstringString handling in C++/WinRT 有更多关于该主题的信息。

【讨论】:

  • 感谢您的回复。我发现很难理解这句话的两个部分:“虽然这是有问题的,但你是否真的想要返回一个指向其他地方拥有的一些数据中间的指针。”和“最好只按值返回一个 hstring。C++/WinRT 中的字符串处理有关于该主题的更多信息。”你能详细说明一下吗?我无法理解第一部分,似乎无法找到该链接的哪一部分可以帮助我按值获取 hstring。
  • @ssn 将你的函数签名设为hstring foo() {...},并用return text 代替return text.c_str()。与返回 c_str() 不同,这将确保只要您持有 hstring,引用的字符串值就会保持活动状态。由于 C++ 不允许您使用允许编译器跟踪对象生命周期的信息来注释指针,因此您经常会遇到悬空指针。 hstring 类可以方便地解决这个(和其他)问题,就像 C++ 的std::wstring
  • 我想问题是这个函数的调用者是跨平台代码,需要了解所有平台的返回值。这就是为什么我需要返回 c_str()
  • @ssn 如果调用者请求一个裸露的wchar_t*,它必须在文档或代码中声明所有权或生命周期要求。缺少这一点,您将无法编写正确的程序来与该调用者交互。不过,这是一个不同的问题,您必须与实现的调用者协商。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
相关资源
最近更新 更多