В моем WinRT API я должен создать и вернуть HSTRING
ценности. До сих пор я использовал WindowsCreateString
создавать HSTRING
значение и удаление его вручную WindowsDeleteString
,
WindowsCreateStringReference выглядит довольно удобно с точки зрения, не нужно удалять HSTRING
вручную.
Вам не нужно вызывать функцию WindowsDeleteString для отмены выделения быстрого прохода HSTRING, созданного функцией WindowsCreateStringReference.
Кто-нибудь может уточнить, что fast-pass string
и как и когда это фактически распределяется?
Другой вопрос, который возникает здесь, когда я должен предпочесть WindowsCreateString
над WindowsCreateStringReference
?
Строка ‘fast-pass’ не управляет временем жизни своей строки — она просто создает оболочку вокруг любой базовой строки, которую вы ей даете. Эта обертка очень легкая.
Это означает 2 вещи — во-первых, вам не нужно удалять HSTRING
(поскольку он не владеет базовой строкой), но что более важно, вы должны поддерживать базовую строку в неизменном состоянии, пока используется строка быстрого прохода.
Так что это полезно, если у вас уже есть строка (например, const char * в разделе rodata или из другого источника, чье время жизни строго больше, чем время жизни HSTRING). Но это просто оптимизация, чтобы избежать копирования.
Моя рекомендация — если вы заботитесь только о времени жизни и правильно освободите строку, когда закончите, — это использовать Microsoft::WRL::Wrapper::HString
класс, который обеспечивает хорошую оболочку RAII в стиле C ++ вокруг raw HSTRING
и правильно их освободит после завершения. Затем с помощью функций-членов Detach
, Get
, GetAddressOf
и т. д. затем вы можете взаимодействовать с другими API, которые ожидают сырой HSTRING
s.
Если вы заботитесь о скорости, всегда есть Microsoft::WRL::Wrapper::HStringReference
класс, который дублирует WindowsCreateStringReference
Функциональность, но опять же с красивым объектом CII RAII.
Других решений пока нет …