X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/521bf4ff3ef47059265beff5d53c9e1162beb122..508b6523350b4b1c4b2518b6c8c69e5d161f26c5:/src/msw/ole/oleutils.cpp diff --git a/src/msw/ole/oleutils.cpp b/src/msw/ole/oleutils.cpp index 8493a938ef..59f387426c 100644 --- a/src/msw/ole/oleutils.cpp +++ b/src/msw/ole/oleutils.cpp @@ -21,13 +21,15 @@ #include "wx/wxprec.h" #if defined(__BORLANDC__) -#pragma hdrstop + #pragma hdrstop #endif -#include "wx/log.h" - #if wxUSE_OLE +#ifndef WX_PRECOMP + #include "wx/log.h" +#endif + #ifndef __CYGWIN10__ #include "wx/msw/private.h" @@ -66,31 +68,33 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount) return false; } -BSTR wxConvertStringToOle(const wxString& str) +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(); } -wxString wxConvertStringFromOle(BSTR bStr) +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 ( !::WideCharToMultiByte(CP_ACP, 0 /* no flags */, + bStr, len /* not necessary NUL-terminated */, + wxStringBuffer(str, len + 1), len + 1, + NULL, NULL /* no default char */) ) + { + str.clear(); + } #endif + return str; } @@ -98,49 +102,25 @@ 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