在WinRT API中,我必须创建并返回HSTRING
值。到目前为止,我一直在使用WindowsCreateString
创建HSTRING
值并使用WindowsDeleteString
手动将其删除。
WindowsCreateStringReference看起来非常方便,因为不必手动删除HSTRING
。
您无需调用WindowsDeleteString函数即可取消分配WindowsCreateStringReference函数创建的快速传递HSTRING。
任何人都可以详细说明什么是fast-pass string
以及实际上如何以及何时对其进行取消分配吗?
这里出现的另一个问题是,我何时应该更喜欢WindowsCreateString
而不是WindowsCreateStringReference
?
答案 0 :(得分:1)
“快速通过”字符串无法管理其字符串的生存期-只是围绕您提供的任何基础字符串创建包装器。这个包装器非常轻巧。
这意味着两件事-首先,您不需要删除HSTRING
(因为它不拥有基础字符串),但更重要的是,您必须保持基础字符串有效且不变,而快速传递字符串。
因此,如果您已经有一个字符串(例如,在rodata节中为const char *,或其他生存期严格大于HSTRING生存期的来源),则它很有用。但这只是为了避免复制而进行的优化。
我的建议-如果您只关心生命周期并在完成后正确释放字符串,则建议使用Microsoft::WRL::Wrapper::HString
类,该类为原始HSTRING
周围提供了一个不错的C ++风格RAII包装器,并且完成后正确释放它们。然后使用成员函数Detach
,Get
,GetAddressOf
等,然后可以与需要原始HSTRING
的其他API进行交互。
如果您还关心速度,那么总是有一个Microsoft::WRL::Wrapper::HStringReference
类,它复制了WindowsCreateStringReference
的功能,但还是带有一个不错的c ++ RAII对象。