// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_WIN_SCOPED_HSTRING_H_ #define BASE_WIN_SCOPED_HSTRING_H_ #include #include "base/scoped_generic.h" #include "base/strings/string_piece_forward.h" namespace base { namespace internal { // Scoped HSTRING class to maintain lifetime of HSTRINGs allocated with // WindowsCreateString(). struct BASE_EXPORT ScopedHStringTraits { static HSTRING InvalidValue() { return nullptr; } static void Free(HSTRING hstr); }; } // namespace internal namespace win { // ScopedHString is a wrapper around an HSTRING. Note that it requires certain // functions that are only available on Windows 8 and later, and that these // functions need to be delayloaded to avoid breaking Chrome on Windows 7. // // Callers MUST check the return value of ResolveCoreWinRTStringDelayLoad() // *before* using ScopedHString. // // One-time Initialization for ScopedHString: // // bool success = ScopedHString::ResolveCoreWinRTStringDelayload(); // if (!success) { // // ScopeHString can be used. // } else { // // Handle error. // } // // Example use: // // ScopedHString string = ScopedHString::Create(L"abc"); // // Also: // // HSTRING win_string; // HRESULT hr = WindowsCreateString(..., &win_string); // ScopedHString string(win_string); // class BASE_EXPORT ScopedHString : public ScopedGeneric { public: // Constructs a ScopedHString from an HSTRING, and takes ownership of |hstr|. explicit ScopedHString(HSTRING hstr); static ScopedHString Create(StringPiece16 str); static ScopedHString Create(StringPiece str); // Loads all required HSTRING functions, available from Win8 and onwards. static bool ResolveCoreWinRTStringDelayload(); StringPiece16 Get() const; std::string GetAsUTF8() const; }; } // namespace win } // namespace base #endif // BASE_WIN_SCOPED_HSTRING_H_