use standard functions for BSTR handling instead of doing it ourselves incorrectly (fixed patch 1829152)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49882 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-11-13 01:18:06 +00:00
parent 49b3b52cc8
commit a518e5080d
2 changed files with 18 additions and 45 deletions

View File

@@ -208,24 +208,21 @@ class WXDLLEXPORT wxBasicString
{ {
public: public:
// ctors & dtor // ctors & dtor
wxBasicString(const char *sz);
wxBasicString(const wxString& str); wxBasicString(const wxString& str);
wxBasicString(const wxBasicString& bstr);
~wxBasicString(); ~wxBasicString();
void Init(const char* sz); wxBasicString& operator=(const wxBasicString& bstr);
// accessors // accessors
// just get the string // just get the string
operator BSTR() const { return m_wzBuf; } operator BSTR() const { return m_bstrBuf; }
// retrieve a copy of our string - caller must SysFreeString() it later! // retrieve a copy of our string - caller must SysFreeString() it later!
BSTR Get() const { return SysAllocString(m_wzBuf); } BSTR Get() const { return SysAllocString(m_bstrBuf); }
private: private:
// @@@ not implemented (but should be) // actual string
wxBasicString(const wxBasicString&); BSTR m_bstrBuf;
wxBasicString& operator=(const wxBasicString&);
OLECHAR *m_wzBuf; // actual string
}; };
#if wxUSE_VARIANT #if wxUSE_VARIANT

View File

@@ -91,49 +91,25 @@ WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr)
// wxBasicString // wxBasicString
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// ctor takes an ANSI string and transforms it to Unicode
wxBasicString::wxBasicString(const char *sz)
{
Init(sz);
}
// ctor takes an ANSI or Unicode string and transforms it to Unicode
wxBasicString::wxBasicString(const wxString& str) wxBasicString::wxBasicString(const wxString& str)
{ {
#if wxUSE_UNICODE m_bstrBuf = SysAllocString(str.wc_str(*wxConvCurrent));
m_wzBuf = new OLECHAR[str.length() + 1];
memcpy(m_wzBuf, str.c_str(), str.length()*2);
m_wzBuf[str.length()] = L'\0';
#else
Init(str.c_str());
#endif
} }
// Takes an ANSI string and transforms it to Unicode wxBasicString::wxBasicString(const wxBasicString& src)
void wxBasicString::Init(const char *sz)
{ {
// get the size of required buffer m_bstrBuf = src.Get();
UINT lenAnsi = strlen(sz); }
#ifdef __MWERKS__
UINT lenWide = lenAnsi * 2 ; wxBasicString& wxBasicString::operator=(const wxBasicString& src)
#else {
UINT lenWide = mbstowcs(NULL, sz, lenAnsi); SysReAllocString(&m_bstrBuf, src);
#endif return *this;
if ( lenWide > 0 ) {
m_wzBuf = new OLECHAR[lenWide + 1];
mbstowcs(m_wzBuf, sz, lenAnsi);
m_wzBuf[lenWide] = L'\0';
}
else {
m_wzBuf = NULL;
}
} }
// dtor frees memory
wxBasicString::~wxBasicString() wxBasicString::~wxBasicString()
{ {
delete [] m_wzBuf; SysFreeString(m_bstrBuf);
} }
#if wxUSE_DATAOBJ #if wxUSE_DATAOBJ