0

在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 。我错过了什么?

4

1 回答 1

1

看起来您想在IInspectable接口后面拆箱标量值(请参阅使用 C++/WinRT 将标量值装箱和拆箱到 IInspectable)。对于拆箱,您需要使用unbox_value函数模板:

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

尽管值得怀疑,但您是否真的要返回一个指向其他地方拥有的某些数据中间的指针。最好只返回一个hstring按值。C++/WinRT中的字符串处理包含有关该主题的更多信息。

于 2020-08-30T16:37:25.973 回答