Make wxBasicString as simple and safe to use as possible
Don't try to write a general purpose class, but provide just the methods
that we need in our code.
This fixes the bug added in 294436c8bb
which resulted in a crash because a literal string, not a BSTR, was
passed to wxBasicString ctor.
This commit is contained in:
@@ -66,24 +66,26 @@ inline void wxOleUninitialize()
|
|||||||
class WXDLLIMPEXP_CORE wxBasicString
|
class WXDLLIMPEXP_CORE wxBasicString
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Takes over the ownership of bstr
|
// Constructs with the owned BSTR set to NULL
|
||||||
explicit wxBasicString(BSTR bstr = NULL);
|
wxBasicString() : m_bstrBuf(NULL) {}
|
||||||
|
|
||||||
// Constructs the BSTR from wxString
|
// Constructs with the owned BSTR created from a wxString
|
||||||
wxBasicString(const wxString& str);
|
wxBasicString(const wxString& str)
|
||||||
|
: m_bstrBuf(SysAllocString(str.wc_str(*wxConvCurrent))) {}
|
||||||
|
|
||||||
// Creates a copy of the BSTR owned by bstr
|
// Constructs with the owned BSTR as a copy of the BSTR owned by bstr
|
||||||
wxBasicString(const wxBasicString& bstr);
|
wxBasicString(const wxBasicString& bstr) : m_bstrBuf(bstr.Copy()) {}
|
||||||
|
|
||||||
// Frees the owned BSTR
|
// Frees the owned BSTR
|
||||||
~wxBasicString();
|
~wxBasicString() { SysFreeString(m_bstrBuf); }
|
||||||
|
|
||||||
// Returns the owned BSTR and gives up its ownership
|
// Creates the owned BSTR from a wxString
|
||||||
|
void AssignFromString(const wxString& str);
|
||||||
|
|
||||||
|
// Returns the owned BSTR and gives up its ownership,
|
||||||
|
// the caller is responsible for freeing it
|
||||||
BSTR Detach();
|
BSTR Detach();
|
||||||
|
|
||||||
// Frees the owned BSTR
|
|
||||||
void Free();
|
|
||||||
|
|
||||||
// Returns a copy of the owned BSTR,
|
// Returns a copy of the owned BSTR,
|
||||||
// the caller is responsible for freeing it
|
// the caller is responsible for freeing it
|
||||||
BSTR Copy() const { return SysAllocString(m_bstrBuf); }
|
BSTR Copy() const { return SysAllocString(m_bstrBuf); }
|
||||||
@@ -95,12 +97,6 @@ public:
|
|||||||
// Sets its BSTR to a copy of the BSTR owned by bstr
|
// Sets its BSTR to a copy of the BSTR owned by bstr
|
||||||
wxBasicString& operator=(const wxBasicString& bstr);
|
wxBasicString& operator=(const wxBasicString& bstr);
|
||||||
|
|
||||||
// Creates its BSTR from wxString
|
|
||||||
wxBasicString& operator=(const wxString& str);
|
|
||||||
|
|
||||||
// Takes over the ownership of bstr
|
|
||||||
wxBasicString& operator=(BSTR bstr);
|
|
||||||
|
|
||||||
/// Returns the owned BSTR while keeping its ownership
|
/// Returns the owned BSTR while keeping its ownership
|
||||||
operator BSTR() const { return m_bstrBuf; }
|
operator BSTR() const { return m_bstrBuf; }
|
||||||
|
|
||||||
|
@@ -130,8 +130,8 @@ bool wxAutomationObject::Invoke(const wxString& member, int action,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int namedArgStringCount = namedArgCount + 1;
|
int namedArgStringCount = namedArgCount + 1;
|
||||||
wxVector<wxBasicString> argNames(namedArgStringCount, wxString());
|
wxVector<wxBasicString> argNames(namedArgStringCount);
|
||||||
argNames[0] = member;
|
argNames[0].AssignFromString(member);
|
||||||
|
|
||||||
// Note that arguments are specified in reverse order
|
// Note that arguments are specified in reverse order
|
||||||
// (all totally logical; hey, we're dealing with OLE here.)
|
// (all totally logical; hey, we're dealing with OLE here.)
|
||||||
@@ -141,7 +141,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action,
|
|||||||
{
|
{
|
||||||
if ( !INVOKEARG(i).GetName().empty() )
|
if ( !INVOKEARG(i).GetName().empty() )
|
||||||
{
|
{
|
||||||
argNames[(namedArgCount-j)] = INVOKEARG(i).GetName();
|
argNames[(namedArgCount-j)].AssignFromString(INVOKEARG(i).GetName());
|
||||||
j ++;
|
j ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -70,25 +70,10 @@ WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr)
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxBasicString
|
// wxBasicString
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
void wxBasicString::AssignFromString(const wxString& str)
|
||||||
wxBasicString::wxBasicString(BSTR bstr)
|
|
||||||
{
|
|
||||||
m_bstrBuf = bstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxBasicString::wxBasicString(const wxString& str)
|
|
||||||
{
|
|
||||||
m_bstrBuf = SysAllocString(str.wc_str(*wxConvCurrent));
|
|
||||||
}
|
|
||||||
|
|
||||||
wxBasicString::wxBasicString(const wxBasicString& bstr)
|
|
||||||
{
|
|
||||||
m_bstrBuf = bstr.Copy();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxBasicString::~wxBasicString()
|
|
||||||
{
|
{
|
||||||
SysFreeString(m_bstrBuf);
|
SysFreeString(m_bstrBuf);
|
||||||
|
m_bstrBuf = SysAllocString(str.wc_str(*wxConvCurrent));
|
||||||
}
|
}
|
||||||
|
|
||||||
BSTR wxBasicString::Detach()
|
BSTR wxBasicString::Detach()
|
||||||
@@ -100,12 +85,6 @@ BSTR wxBasicString::Detach()
|
|||||||
return bstr;
|
return bstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxBasicString::Free()
|
|
||||||
{
|
|
||||||
SysFreeString(m_bstrBuf);
|
|
||||||
m_bstrBuf = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
BSTR* wxBasicString::ByRef()
|
BSTR* wxBasicString::ByRef()
|
||||||
{
|
{
|
||||||
wxASSERT_MSG(!m_bstrBuf,
|
wxASSERT_MSG(!m_bstrBuf,
|
||||||
@@ -126,25 +105,6 @@ wxBasicString& wxBasicString::operator=(const wxBasicString& src)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxBasicString& wxBasicString::operator=(const wxString& str)
|
|
||||||
{
|
|
||||||
SysFreeString(m_bstrBuf);
|
|
||||||
m_bstrBuf = SysAllocString(str.wc_str(*wxConvCurrent));
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxBasicString& wxBasicString::operator=(BSTR bstr)
|
|
||||||
{
|
|
||||||
wxCHECK_MSG(m_bstrBuf == NULL || m_bstrBuf != bstr,
|
|
||||||
*this, wxS("Attempting to assign already owned BSTR"));
|
|
||||||
|
|
||||||
SysFreeString(m_bstrBuf);
|
|
||||||
m_bstrBuf = bstr;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Convert variants
|
// Convert variants
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user