X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4db172a3b318df9aff178eb6c5da149d56e0859..a4afdcf3424e84538bb5105604aad0dbc97eeeaf:/src/msw/ole/oleutils.cpp diff --git a/src/msw/ole/oleutils.cpp b/src/msw/ole/oleutils.cpp index 058f4afd87..3932c8d9ec 100644 --- a/src/msw/ole/oleutils.cpp +++ b/src/msw/ole/oleutils.cpp @@ -70,29 +70,32 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount) WXDLLEXPORT BSTR wxConvertStringToOle(const wxString& str) { -/* - unsigned int len = strlen((const char*) str); - unsigned short* s = new unsigned short[len*2+2]; - unsigned int i; - memset(s, 0, len*2+2); - for (i=0; i < len; i++) - s[i*2] = str[i]; -*/ - wxBasicString bstr(str.mb_str()); - return bstr.Get(); + return wxBasicString(str).Get(); } WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr) { + // NULL BSTR is equivalent to an empty string (this is the convention used + // by VB and hence we must follow it) + if ( !bStr ) + return wxString(); + + const int len = SysStringLen(bStr); + #if wxUSE_UNICODE - wxString str(bStr); + wxString str(bStr, len); #else - int len = SysStringLen(bStr) + 1; - char *buf = new char[len]; - (void)wcstombs( buf, bStr, len); - wxString str(buf); - delete[] buf; + wxString str; + if (len) + { + wxStringBufferLength buf(str, len); // asserts if len == 0 + buf.SetLength(WideCharToMultiByte(CP_ACP, 0 /* no flags */, + bStr, len /* not necessarily NUL-terminated */, + buf, len, + NULL, NULL /* no default char */)); + } #endif + return str; } @@ -100,49 +103,25 @@ WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr) // wxBasicString // ---------------------------------------------------------------------------- -// ctor takes an ANSI string and transforms it to Unicode -wxBasicString::wxBasicString(const char *sz) +wxBasicString::wxBasicString(const wxString& str) { - Init(sz); + m_bstrBuf = SysAllocString(str.wc_str(*wxConvCurrent)); } -// ctor takes an ANSI or Unicode string and transforms it to Unicode -wxBasicString::wxBasicString(const wxString& str) +wxBasicString::wxBasicString(const wxBasicString& src) { -#if wxUSE_UNICODE - 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 + m_bstrBuf = src.Get(); } -// Takes an ANSI string and transforms it to Unicode -void wxBasicString::Init(const char *sz) +wxBasicString& wxBasicString::operator=(const wxBasicString& src) { - // get the size of required buffer - UINT lenAnsi = strlen(sz); -#ifdef __MWERKS__ - UINT lenWide = lenAnsi * 2 ; -#else - UINT lenWide = mbstowcs(NULL, sz, lenAnsi); -#endif - - if ( lenWide > 0 ) { - m_wzBuf = new OLECHAR[lenWide + 1]; - mbstowcs(m_wzBuf, sz, lenAnsi); - m_wzBuf[lenWide] = L'\0'; - } - else { - m_wzBuf = NULL; - } + SysReAllocString(&m_bstrBuf, src); + return *this; } -// dtor frees memory wxBasicString::~wxBasicString() { - delete [] m_wzBuf; + SysFreeString(m_bstrBuf); } #if wxUSE_DATAOBJ @@ -151,7 +130,7 @@ wxBasicString::~wxBasicString() // Debug support // ---------------------------------------------------------------------------- -#if defined(__WXDEBUG__) && ( ( defined(__VISUALC__) && (__VISUALC__ > 1000) ) || defined(__MWERKS__) ) +#if wxDEBUG_LEVEL && ( ( defined(__VISUALC__) && (__VISUALC__ > 1000) ) || defined(__MWERKS__) ) static wxString GetIidName(REFIID riid) { // an association between symbolic name and numeric value of an IID @@ -279,31 +258,10 @@ void wxLogRelease(const wxChar *szInterface, ULONG cRef) wxLogTrace(wxTRACE_OleCalls, wxT("After %s::Release: m_cRef = %d"), szInterface, cRef - 1); } -#elif defined(__WXDEBUG__) && defined(__VISUALC__) && (__VISUALC__ <= 1000) +#endif // wxDEBUG_LEVEL -// For VC++ 4 -void wxLogQueryInterface(const char *szInterface, REFIID riid) -{ - wxLogTrace("%s::QueryInterface", szInterface); -} +#endif // wxUSE_DRAG_AND_DROP -void wxLogAddRef(const char *szInterface, ULONG cRef) -{ - wxLogTrace("After %s::AddRef: m_cRef = %d", szInterface, cRef + 1); -} - -void wxLogRelease(const char *szInterface, ULONG cRef) -{ - wxLogTrace("After %s::Release: m_cRef = %d", szInterface, cRef - 1); -} +#endif // __CYGWIN10__ -#endif // __WXDEBUG__ - -#endif - // wxUSE_DRAG_AND_DROP - -#endif - // __CYGWIN10__ - -#endif - // wxUSE_OLE +#endif // wxUSE_OLE