C++ hs使用WindowsCreateStringReference与WindowsCreateString取消分配字符串

C++ hs使用WindowsCreateStringReference与WindowsCreateString取消分配字符串,c++,windows,windows-runtime,c++-winrt,C++,Windows,Windows Runtime,C++ Winrt,在我的WinRT API中,我必须创建并返回HSTRING值。到目前为止,我一直在使用WindowsCreateString创建HSTRING值,并使用WindowsDeleteString手动删除它 从不用手动删除HSTRING的角度来看,它非常方便 无需调用WindowsDeleteString函数来取消分配WindowsCreateStringReference函数创建的快速传递字符串 有人能详细说明什么是快速传递字符串,以及它实际上是如何以及何时被取消分配的吗 这里出现的另一个问题是,我

在我的WinRT API中,我必须创建并返回
HSTRING
值。到目前为止,我一直在使用
WindowsCreateString
创建
HSTRING
值,并使用
WindowsDeleteString
手动删除它

从不用手动删除
HSTRING
的角度来看,它非常方便

无需调用WindowsDeleteString函数来取消分配WindowsCreateStringReference函数创建的快速传递字符串

有人能详细说明什么是
快速传递字符串
,以及它实际上是如何以及何时被取消分配的吗


这里出现的另一个问题是,我什么时候应该更喜欢
WindowsCreateString
而不是
WindowsCreateStringReference

一个“快速传递”字符串并不能管理其字符串的生存期-它只是围绕您给定的任何底层字符串创建一个包装器。这个包装很轻

这意味着两件事-首先,您不需要删除
HSTRING
(因为它不拥有基础字符串),但更重要的是,在使用快速传递字符串时,您必须保持基础字符串处于活动状态且保持不变

因此,如果您已经有一个字符串(比如rodata部分中的const char*,或者来自另一个生存期严格大于HSTRING生存期的源),那么它非常有用。但这只是为了避免复制而进行的优化

我的建议——如果你只关心生命周期并正确地完成了字符串的操作——就是使用类,它提供了一个很好的C++风格RAIII包装器,它在WRAW <代码> HString 中,并且在完成后将正确地释放它们。然后使用成员函数

Detach
Get
GetAddressOf
等,您可以与其他需要原始
HSTRING
的API交互


<>如果你真的关心速度,总是有一个代码>微软::Wr:::包装::HSTRIGRUP参考< /Cord>类,重复了<代码> WistWHORATESTRIGRIGRESUT> <代码>函数,但是再次使用了一个漂亮C++ C++对象。可能比半手动WRL实现更适合。根据我的观察,只要
Microsoft::WRL::Wrapper::HString
类的对象被销毁,它的atached
HString
也会失效。这听起来与
WindowsCreateStringReference
给出的包装器非常相似,但稍微优雅一点。
WindowsCreateStringReference
在道德上等同于。它不拥有资源,但只提供了一个与底层资源的可观察接口。由于快速传递字符串(和
string\u视图
s)不拥有资源,因此您负责管理对象生命周期。被引用的资源必须至少与该资源中的视图一样长。如果您从界面返回
hs字符串
,则无法建立该字符串(除非您愿意泄漏内存)。感谢您的澄清。实际上,我需要将HSTRING和Im stick返回到WindowsCreate/DeleteString API pairs,这只是部分正确。您不需要调用
WindowsDeleteString
。这是你客户的责任。当您返回
hs字符串时,您正在转移所有权。客户可以自由选择如何处理责任。他们可以使用原始
HSTRING
手动执行清理,或者使用自动资源管理将其绑定到对象(如在C++/WinRT中)。我假设您的客户端使用C++/CX(而不是C++/CLI)。无论如何,在返回字符串时,始终返回
HSTRING
句柄。根据客户端使用的语言投影,原始资源看起来像自然类型(例如,在C++/CX的情况下)。根本没有转换<代码>平台::字符串
仍然管理它接收到的原始
hs字符串
。这是透明的,你不需要做任何特别的事情。如果您确实在使用C++/CX,则值得一读。