Windows runtime 与winrt::impl::com\u ref<;相关的错误;winrt::hs字符串>;从c+转换时+/cx至c++/温特

Windows runtime 与winrt::impl::com\u ref<;相关的错误;winrt::hs字符串>;从c+转换时+/cx至c++/温特,windows-runtime,uwp-xaml,c++-winrt,cppwinrt,Windows Runtime,Uwp Xaml,C++ Winrt,Cppwinrt,在cppcx中,我曾经有这样一个: auto button = safe_cast<ContentControl ^>(obj); if (auto text = dynamic_cast<Platform::String^>(button->Content)) { return text->Data(); } auto按钮=safe_cast(obj); 如果(自动文本=动态施法(按钮->内容)){ 返回文本->数据(); } 当我尝试将此代码转

在cppcx中,我曾经有这样一个:

auto button = safe_cast<ContentControl ^>(obj);
if (auto text = dynamic_cast<Platform::String^>(button->Content)) {
    return text->Data();
}
auto按钮=safe_cast(obj);
如果(自动文本=动态施法(按钮->内容)){
返回文本->数据();
}
当我尝试将此代码转换为cppwinrt时:

auto button = obj.as<winrt::ContentControl>();
if (auto text = button.Content().try_as<winrt::hstring>()) {
    return text.c_str();
}
auto按钮=obj.as();
if(auto text=button.Content().try_as()){
返回text.c_str();
}
我得到以下错误:

错误(活动)E0312不存在从“winrt::impl::com\u refwinrt::hstring”到“wchar\u t*”的合适的用户定义转换


我希望通过try_as可以得到一个winrt::hs字符串,并且可以从中得到.c_str(),但是我得到的是一个winrt::impl::com_refwinrt::hs字符串。我遗漏了什么?

看起来您想在
IInspectable
接口后面取消一个标量值的装箱(请参阅)。要取消装箱,您需要使用函数模板:

auto按钮=obj.as();
如果(自动文本=取消X_值(button.Content())){
返回text.c_str();
}

尽管存在疑问,但您是否真的希望返回指向其他地方拥有的某些数据中间的指针。最好只返回一个by值。有关于此主题的更多信息。

感谢,库刚刚阻止您返回悬空指针。是否有可能解决此问题?感谢您的回复。我发现很难理解这句话的两个部分:“虽然有疑问,但您是否真的想返回指向其他地方拥有的某些数据中间的指针。”以及“可能最好只按值返回一个hstring。C++/WinRT中的字符串处理有关于此主题的更多信息。”你能详细说明一下吗?我无法理解第一部分,似乎无法找到该链接的哪一部分可以帮助我按值获取字符串。@ssn使您的函数签名
hstring foo(){…}
,而不是
返回文本.c_str()
只是
返回文本
。与返回
c_str()
不同,这将确保只要按住
hstring
,引用的字符串值就会保持活动状态。因为C++不允许你用允许编译器跟踪对象生命周期的信息注释指针,所以你经常会遇到悬空指针。
hstring
类很方便地解决了这个(和其他)问题,就像C++
std::wstring
一样。我想问题是这个函数的调用方是跨平台的代码,需要了解所有平台的返回值。这就是为什么我需要返回c_str()。否则,您就无法编写正确的程序来与该调用者接口。不过,这是另一个问题,您必须与实现的调用方协商。