18#include <QtCore/private/qglobal_p.h>
20#if defined(Q_OS_WIN) || defined(Q_QDOC)
22#include <QtCore/qt_windows.h>
23#include <QtCore/qstring.h>
40 explicit QBStr(LPCOLESTR str)
noexcept
43 m_str = ::SysAllocString(str);
44 Q_ASSERT(m_str || !str);
47 explicit QBStr(
const QString &str)
noexcept
50 m_str = ::SysAllocString(
reinterpret_cast<
const wchar_t *>(str.utf16()));
51 Q_ASSERT(m_str || str.isNull());
54 QBStr(
const QBStr &str)
noexcept : m_str{ str.copy() } { }
56 QBStr(QBStr &&str)
noexcept : m_str{ std::exchange(str.m_str,
nullptr) } { }
59 QBStr &operator=(LPCOLESTR str)
noexcept
63 m_str = ::SysAllocString(str);
64 Q_ASSERT(m_str || !str);
68 QBStr &operator=(
const QString &str)
noexcept
72 m_str = ::SysAllocString(
reinterpret_cast<
const wchar_t*>(str.utf16()));
73 Q_ASSERT(m_str || str.isNull());
77 QBStr &operator=(
const QBStr &rhs)
noexcept
79 if (
this != std::addressof(rhs))
85 QBStr &operator=(QBStr &&rhs)
noexcept
87 if (
this != std::addressof(rhs))
88 reset(std::exchange(rhs.m_str,
nullptr));
93 const BSTR &bstr()
const noexcept
100 return QString::fromWCharArray(m_str);
103 [[nodiscard]] BSTR release()
noexcept
105 return std::exchange(m_str,
nullptr);
108 [[nodiscard]] BSTR *operator&()
noexcept
118 ::SysFreeString(m_str);
122 void reset(BSTR str)
noexcept
128 [[nodiscard]] BSTR copy()
const noexcept
133 return ::SysAllocStringByteLen(
reinterpret_cast<
const char *>(m_str),
134 ::SysStringByteLen(m_str));
137 BSTR m_str =
nullptr;