使用WindowsCreateStringReference和WindowsCreateString进行HSTRING取消分配

时间:2018-12-11 08:13:36

标签: c++ windows windows-runtime c++-winrt

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

WindowsCreateStringReference看起来非常方便,因为不必手动删除HSTRING

  

您无需调用WindowsDeleteString函数即可取消分配WindowsCreateStringReference函数创建的快速传递HSTRING。

任何人都可以详细说明什么是fast-pass string以及实际上如何以及何时对其进行取消分配吗?

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

1 个答案:

答案 0 :(得分:1)

“快速通过”字符串无法管理其字符串的生存期-只是围绕您提供的任何基础字符串创建包装器。这个包装器非常轻巧。

这意味着两件事-首先,您不需要删除HSTRING(因为它不拥有基础字符串),但更重要的是,您必须保持基础字符串有效且不变,而快速传递字符串。

因此,如果您已经有一个字符串(例如,在rodata节中为const char *,或其他生存期严格大于HSTRING生存期的来源),则它很有用。但这只是为了避免复制而进行的优化。

我的建议-如果您只关心生命周期并在完成后正确释放字符串,则建议使用Microsoft::WRL::Wrapper::HString类,该类为原始HSTRING周围提供了一个不错的C ++风格RAII包装器,并且完成后正确释放它们。然后使用成员函数DetachGetGetAddressOf等,然后可以与需要原始HSTRING的其他API进行交互。

如果您还关心速度,那么总是有一个Microsoft::WRL::Wrapper::HStringReference类,它复制了WindowsCreateStringReference的功能,但还是带有一个不错的c ++ RAII对象。