19#include <QtCore/private/qglobal_p.h>
21#if defined(Q_OS_WIN) || defined(Q_QDOC)
23#include <QtCore/qt_windows.h>
24#include <QtCore/qstring.h>
41 explicit QBStr(LPCOLESTR str)
noexcept
44 m_str = ::SysAllocString(str);
45 Q_ASSERT(m_str || !str);
48 explicit QBStr(
const QString &str)
noexcept
51 m_str = ::SysAllocString(
reinterpret_cast<
const wchar_t *>(str.utf16()));
52 Q_ASSERT(m_str || str.isNull());
55 QBStr(
const QBStr &str)
noexcept : m_str{ str.copy() } { }
57 QBStr(QBStr &&str)
noexcept : m_str{ std::exchange(str.m_str,
nullptr) } { }
60 QBStr &operator=(LPCOLESTR str)
noexcept
64 m_str = ::SysAllocString(str);
65 Q_ASSERT(m_str || !str);
69 QBStr &operator=(
const QString &str)
noexcept
73 m_str = ::SysAllocString(
reinterpret_cast<
const wchar_t*>(str.utf16()));
74 Q_ASSERT(m_str || str.isNull());
78 QBStr &operator=(
const QBStr &rhs)
noexcept
80 if (
this != std::addressof(rhs))
86 QBStr &operator=(QBStr &&rhs)
noexcept
88 if (
this != std::addressof(rhs))
89 reset(std::exchange(rhs.m_str,
nullptr));
94 const BSTR &bstr()
const noexcept
101 return QString::fromWCharArray(m_str);
104 [[nodiscard]] BSTR release()
noexcept
106 return std::exchange(m_str,
nullptr);
109 [[nodiscard]] BSTR *operator&()
noexcept
119 ::SysFreeString(m_str);
123 void reset(BSTR str)
noexcept
129 [[nodiscard]] BSTR copy()
const noexcept
134 return ::SysAllocStringByteLen(
reinterpret_cast<
const char *>(m_str),
135 ::SysStringByteLen(m_str));
138 BSTR m_str =
nullptr;