diff --git a/include/wx/msw/ole/activex.h b/include/wx/msw/ole/activex.h index 8ecd647208..1518671eb8 100644 --- a/include/wx/msw/ole/activex.h +++ b/include/wx/msw/ole/activex.h @@ -21,7 +21,7 @@ // wx includes //--------------------------------------------------------------------------- -#include "wx/msw/ole/oleutils.h" +#include "wx/msw/ole/oleutils.h" // wxBasicString &c #include "wx/msw/ole/uuid.h" #include "wx/window.h" #include "wx/variant.h" diff --git a/include/wx/msw/ole/oleutils.h b/include/wx/msw/ole/oleutils.h index 8e50251617..1dab81b18a 100644 --- a/include/wx/msw/ole/oleutils.h +++ b/include/wx/msw/ole/oleutils.h @@ -61,6 +61,29 @@ inline void wxOleUninitialize() ::OleUninitialize(); } +// wrapper around BSTR type (by Vadim Zeitlin) + +class WXDLLIMPEXP_CORE wxBasicString +{ +public: + // ctors & dtor + wxBasicString(const wxString& str); + wxBasicString(const wxBasicString& bstr); + ~wxBasicString(); + + wxBasicString& operator=(const wxBasicString& bstr); + + // accessors + // just get the string + operator BSTR() const { return m_bstrBuf; } + // retrieve a copy of our string - caller must SysFreeString() it later! + BSTR Get() const { return SysAllocString(m_bstrBuf); } + +private: + // actual string + BSTR m_bstrBuf; +}; + #if wxUSE_VARIANT // Convert variants class WXDLLIMPEXP_FWD_BASE wxVariant; @@ -172,56 +195,6 @@ WXDLLIMPEXP_CORE BSTR wxConvertStringToOle(const wxString& str); // Convert string from BSTR to wxString WXDLLIMPEXP_CORE wxString wxConvertStringFromOle(BSTR bStr); -// A thin RAII wrapper for BSTR, which can also create BSTR -// from wxString as well as return the owned BSTR as wxString. -// Unlike _b_str_t, wxBSTR is NOT reference counted. -class WXDLLIMPEXP_CORE wxBSTR -{ -public: - // Creates with the owned BSTR set to NULL - wxBSTR() : m_bstr(NULL) {} - - // If copy is true then a copy of bstr is created, - // if not then ownership of bstr is taken. - wxBSTR(BSTR bstr, bool copy); - - // Creates the owned BSTR from wxString str - wxBSTR(const wxString& str) : m_bstr(::SysAllocString(str.wc_str(*wxConvCurrent))) {} - - // Creates a copy of BSTR owned by wxbstr - wxBSTR(const wxBSTR& wxbstr) : m_bstr(wxbstr.GetCopy()) {} - - // Frees the owned BSTR - ~wxBSTR() { Free(); } - - // Creates a copy of the BSTR owned by wxbstr - wxBSTR& operator=(const wxBSTR& wxbstr); - - // Takes ownership of bstr - void Attach(BSTR bstr); - - // Returns the owned BSTR and gives up its ownership - BSTR Detach(); - - // Frees the owned BSTR - void Free(); - - // Returns the owned BSTR while keeping its ownership - BSTR GetBSTR() const { return m_bstr; } - operator BSTR() const { return GetBSTR(); } - - // Returns the address of owned BSTR - BSTR* GetAddress() { return &m_bstr; } - - // Returns a copy of owned BSTR - BSTR GetCopy() const { return ::SysAllocString(m_bstr); } - - // Returns the owned BSTR converted to wxString - wxString GetwxString() const { return wxConvertStringFromOle(m_bstr); } -private: - BSTR m_bstr; -}; - #else // !wxUSE_OLE // ---------------------------------------------------------------------------- diff --git a/src/msw/mediactrl_am.cpp b/src/msw/mediactrl_am.cpp index 43cb9c197a..6821e423da 100644 --- a/src/msw/mediactrl_am.cpp +++ b/src/msw/mediactrl_am.cpp @@ -1127,7 +1127,7 @@ bool wxAMMediaBackend::Load(const wxURI& location, const wxURI& proxy) if(pPlay) { pPlay->put_UseHTTPProxy(VARIANT_TRUE); - pPlay->put_HTTPProxyHost(wxBSTR(proxy.GetServer()).Detach()); + pPlay->put_HTTPProxyHost(wxBasicString(proxy.GetServer()).Get()); pPlay->put_HTTPProxyPort(wxAtoi(proxy.GetPort())); pPlay->Release(); } @@ -1150,9 +1150,9 @@ bool wxAMMediaBackend::DoLoad(const wxString& location) // the docs say its async and put_FileName is not - // but in practice they both seem to be async anyway if(GetMP()) - hr = GetMP()->Open( wxBSTR(location).Detach() ); + hr = GetMP()->Open( wxBasicString(location).Get() ); else - hr = GetAM()->put_FileName( wxBSTR(location).Detach() ); + hr = GetAM()->put_FileName( wxBasicString(location).Get() ); if(FAILED(hr)) { diff --git a/src/msw/mediactrl_wmp10.cpp b/src/msw/mediactrl_wmp10.cpp index b8f85c723d..533abf3c76 100644 --- a/src/msw/mediactrl_wmp10.cpp +++ b/src/msw/mediactrl_wmp10.cpp @@ -905,21 +905,21 @@ bool wxWMP10MediaBackend::Load(const wxURI& location, { long lOldSetting; if( pWMPNetwork->getProxySettings( - wxBSTR(location.GetScheme()).Detach(), &lOldSetting + wxBasicString(location.GetScheme()).Get(), &lOldSetting ) == 0 && pWMPNetwork->setProxySettings( - wxBSTR(location.GetScheme()).Detach(), // protocol + wxBasicString(location.GetScheme()).Get(), // protocol 2) == 0) // 2 == manually specify { BSTR bsOldName = NULL; long lOldPort = 0; pWMPNetwork->getProxyName( - wxBSTR(location.GetScheme()).Detach(), + wxBasicString(location.GetScheme()).Get(), &bsOldName); pWMPNetwork->getProxyPort( - wxBSTR(location.GetScheme()).Detach(), + wxBasicString(location.GetScheme()).Get(), &lOldPort); long lPort; @@ -936,11 +936,11 @@ bool wxWMP10MediaBackend::Load(const wxURI& location, } if( pWMPNetwork->setProxyName( - wxBSTR(location.GetScheme()).Detach(), // proto - wxBSTR(server).Detach() ) == 0 && + wxBasicString(location.GetScheme()).Get(), // proto + wxBasicString(server).Get() ) == 0 && pWMPNetwork->setProxyPort( - wxBSTR(location.GetScheme()).Detach(), // proto + wxBasicString(location.GetScheme()).Get(), // proto lPort ) == 0 ) @@ -948,16 +948,16 @@ bool wxWMP10MediaBackend::Load(const wxURI& location, bOK = DoLoad(location.BuildURI()); pWMPNetwork->setProxySettings( - wxBSTR(location.GetScheme()).Detach(), // protocol + wxBasicString(location.GetScheme()).Get(), // protocol lOldSetting); if(bsOldName) pWMPNetwork->setProxyName( - wxBSTR(location.GetScheme()).Detach(), // protocol + wxBasicString(location.GetScheme()).Get(), // protocol bsOldName); if(lOldPort) pWMPNetwork->setProxyPort( - wxBSTR(location.GetScheme()).Detach(), // protocol + wxBasicString(location.GetScheme()).Get(), // protocol lOldPort); pWMPNetwork->Release(); @@ -997,7 +997,7 @@ bool wxWMP10MediaBackend::DoLoad(const wxString& location) { IWMPMedia* pWMPMedia; - if( (hr = pWMPCore3->newMedia(wxBSTR(location).Detach(), + if( (hr = pWMPCore3->newMedia(wxBasicString(location).Get(), &pWMPMedia)) == 0) { // this (get_duration) will actually FAIL, but it will work. @@ -1012,7 +1012,7 @@ bool wxWMP10MediaBackend::DoLoad(const wxString& location) #endif { // just load it the "normal" way - hr = m_pWMPPlayer->put_URL( wxBSTR(location).Detach() ); + hr = m_pWMPPlayer->put_URL( wxBasicString(location).Get() ); } if(FAILED(hr)) @@ -1061,12 +1061,12 @@ bool wxWMP10MediaBackend::ShowPlayerControls(wxMediaCtrlPlayerControls flags) if(!flags) { m_pWMPPlayer->put_enabled(VARIANT_FALSE); - m_pWMPPlayer->put_uiMode(wxBSTR(wxT("none")).Detach()); + m_pWMPPlayer->put_uiMode(wxBasicString(wxT("none")).Get()); } else { // TODO: use "custom"? (note that CE only supports none/full) - m_pWMPPlayer->put_uiMode(wxBSTR(wxT("full")).Detach()); + m_pWMPPlayer->put_uiMode(wxBasicString(wxT("full")).Get()); m_pWMPPlayer->put_enabled(VARIANT_TRUE); } @@ -1358,7 +1358,7 @@ wxLongLong wxWMP10MediaBackend::GetDownloadTotal() if(m_pWMPPlayer->get_currentMedia(&pWMPMedia) == 0) { BSTR bsOut; - pWMPMedia->getItemInfo(wxBSTR(wxT("FileSize")).Detach(), + pWMPMedia->getItemInfo(wxBasicString(wxT("FileSize")).Get(), &bsOut); wxString sFileSize = wxConvertStringFromOle(bsOut); diff --git a/src/msw/ole/access.cpp b/src/msw/ole/access.cpp index d8ce5753ea..7c5d3541d5 100644 --- a/src/msw/ole/access.cpp +++ b/src/msw/ole/access.cpp @@ -937,8 +937,9 @@ STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefau return S_FALSE; } else - { - * pszDefaultAction = wxBSTR(defaultAction).Detach(); + { + wxBasicString basicString(defaultAction); + * pszDefaultAction = basicString.Get(); return S_OK; } } @@ -997,8 +998,9 @@ STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescrip return S_FALSE; } else - { - * pszDescription = wxBSTR(description).Detach(); + { + wxBasicString basicString(description); + * pszDescription = basicString.Get(); return S_OK; } } @@ -1057,8 +1059,9 @@ STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) return S_FALSE; } else - { - * pszHelp = wxBSTR(helpString).Detach(); + { + wxBasicString basicString(helpString); + * pszHelp = basicString.Get(); return S_OK; } } @@ -1168,7 +1171,8 @@ STDMETHODIMP wxIAccessible::get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKe } else { - * pszKeyboardShortcut = wxBSTR(keyboardShortcut).Detach(); + wxBasicString basicString(keyboardShortcut); + * pszKeyboardShortcut = basicString.Get(); return S_OK; } } @@ -1230,8 +1234,9 @@ STDMETHODIMP wxIAccessible::get_accName ( VARIANT varID, BSTR* pszName) return S_FALSE; } else - { - *pszName = wxBSTR(name).Detach(); + { + wxBasicString basicString(name); + *pszName = basicString.Get(); } return S_OK; } @@ -1411,7 +1416,8 @@ STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue) } else { - * pszValue = wxBSTR(strValue).Detach(); + wxBasicString basicString(strValue); + * pszValue = basicString.Get(); return S_OK; } } diff --git a/src/msw/ole/automtn.cpp b/src/msw/ole/automtn.cpp index e77cdbb38f..fdbd9f4d4b 100644 --- a/src/msw/ole/automtn.cpp +++ b/src/msw/ole/automtn.cpp @@ -130,7 +130,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, } int namedArgStringCount = namedArgCount + 1; - wxVector argNames(namedArgStringCount, wxString()); + wxVector argNames(namedArgStringCount, wxString()); argNames[0] = member; // Note that arguments are specified in reverse order @@ -156,7 +156,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, // Get the IDs for the member and its arguments. GetIDsOfNames expects the // member name as the first name, followed by argument names (if any). hr = ((IDispatch*)m_dispatchPtr)->GetIDsOfNames(IID_NULL, - // We rely on the fact that wxBSTR is + // We rely on the fact that wxBasicString is // just BSTR with some methods here. reinterpret_cast(&argNames[0]), 1 + namedArgCount, m_lcid, &dispIds[0]); @@ -499,7 +499,7 @@ namespace HRESULT wxCLSIDFromProgID(const wxString& progId, CLSID& clsId) { - HRESULT hr = CLSIDFromProgID(wxBSTR(progId), &clsId); + HRESULT hr = CLSIDFromProgID(wxBasicString(progId), &clsId); if ( FAILED(hr) ) { wxLogSysError(hr, _("Failed to find CLSID of \"%s\""), progId); diff --git a/src/msw/ole/oleutils.cpp b/src/msw/ole/oleutils.cpp index 6b9b37437d..67c1477753 100644 --- a/src/msw/ole/oleutils.cpp +++ b/src/msw/ole/oleutils.cpp @@ -38,7 +38,7 @@ WXDLLEXPORT BSTR wxConvertStringToOle(const wxString& str) { - return wxBSTR(str).Detach(); + return wxBasicString(str).Get(); } WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr) @@ -68,48 +68,28 @@ WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr) } // ---------------------------------------------------------------------------- -// wxBSTR +// wxBasicString // ---------------------------------------------------------------------------- -wxBSTR::wxBSTR(BSTR bstr, bool copy) -{ - if ( copy ) - m_bstr = ::SysAllocString(bstr); - else - m_bstr = bstr; -} - -wxBSTR& wxBSTR::operator=(const wxBSTR& wxbstr) -{ - if ( this != &wxbstr ) - { - Free(); - m_bstr = wxbstr.GetCopy(); - } - - return *this; -} - -void wxBSTR::Attach(BSTR bstr) -{ - wxCHECK_RET(m_bstr != bstr, wxS("Attaching already attached BSTR!")); - - Free(); - m_bstr = bstr; -} - -BSTR wxBSTR::Detach() -{ - BSTR bstr = m_bstr; - - m_bstr = NULL; - return bstr; -} - -void wxBSTR::Free() -{ - ::SysFreeString(m_bstr); - m_bstr = NULL; +wxBasicString::wxBasicString(const wxString& str) +{ + m_bstrBuf = SysAllocString(str.wc_str(*wxConvCurrent)); +} + +wxBasicString::wxBasicString(const wxBasicString& src) +{ + m_bstrBuf = src.Get(); +} + +wxBasicString& wxBasicString::operator=(const wxBasicString& src) +{ + SysReAllocString(&m_bstrBuf, src); + return *this; +} + +wxBasicString::~wxBasicString() +{ + SysFreeString(m_bstrBuf); } diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index 9de2345401..691a90aeb0 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -231,9 +231,9 @@ wxString wxWebViewIE::GetPageSource() const hr = bodyTag->get_parentElement(&htmlTag); if(SUCCEEDED(hr)) { - wxBSTR wxbstr; - if ( htmlTag->get_outerHTML(wxbstr.GetAddress()) == S_OK ) - source = wxbstr.GetwxString(); + BSTR bstr; + if ( htmlTag->get_outerHTML(&bstr) == S_OK ) + source = wxString(bstr); } } return source; @@ -576,9 +576,9 @@ wxString wxWebViewIE::GetCurrentTitle() const wxString s; if(document) { - wxBSTR title; - if ( document->get_nameProp(title.GetAddress()) == S_OK ) - s = title.GetwxString(); + BSTR title; + if ( document->get_nameProp(&title) == S_OK ) + s = title; } return s; @@ -705,10 +705,10 @@ bool wxWebViewIE::IsEditable() const if(document) { - wxBSTR mode; - if ( document->get_designMode(mode.GetAddress()) == S_OK ) + BSTR mode; + if ( document->get_designMode(&mode) == S_OK ) { - if ( mode.GetwxString() == "On" ) + if ( wxString(mode) == "On" ) return true; } } @@ -731,9 +731,9 @@ bool wxWebViewIE::HasSelection() const HRESULT hr = document->get_selection(&selection); if(SUCCEEDED(hr)) { - wxBSTR type; - if ( selection->get_type(type.GetAddress()) == S_OK ) - sel = type.GetwxString(); + BSTR type; + if ( selection->get_type(&type) == S_OK ) + sel = wxString(type); } return sel != "None"; } @@ -767,9 +767,9 @@ wxString wxWebViewIE::GetSelectedText() const hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); if(SUCCEEDED(hr)) { - wxBSTR text; - if ( range->get_text(text.GetAddress()) == S_OK ) - selected = text.GetwxString(); + BSTR text; + if ( range->get_text(&text) == S_OK ) + selected = wxString(text); } } } @@ -800,9 +800,9 @@ wxString wxWebViewIE::GetSelectedSource() const hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range); if(SUCCEEDED(hr)) { - wxBSTR text; - if ( range->get_htmlText(text.GetAddress()) == S_OK ) - selected = text.GetwxString(); + BSTR text; + if ( range->get_htmlText(&text) == S_OK ) + selected = wxString(text); } } } @@ -841,9 +841,9 @@ wxString wxWebViewIE::GetPageText() const HRESULT hr = document->get_body(&body); if(SUCCEEDED(hr)) { - wxBSTR out; - if ( body->get_innerText(out.GetAddress()) == S_OK ) - text = out.GetwxString(); + BSTR out; + if ( body->get_innerText(&out) == S_OK ) + text = wxString(out); } return text; } @@ -950,7 +950,7 @@ wxCOMPtr wxWebViewIE::GetDocument() const bool wxWebViewIE::IsElementVisible(wxCOMPtr elm) { wxCOMPtr elm1 = elm; - wxBSTR tmp_bstr; + BSTR tmp_bstr; bool is_visible = true; //This method is not perfect but it does discover most of the hidden elements. //so if a better solution is found, then please do improve. @@ -963,13 +963,13 @@ bool wxWebViewIE::IsElementVisible(wxCOMPtr elm) if(SUCCEEDED(elm2->get_currentStyle(&style))) { //Check if the object has the style display:none. - if((style->get_display(tmp_bstr.GetAddress()) != S_OK) || + if((style->get_display(&tmp_bstr) != S_OK) || (tmp_bstr != NULL && (wxCRT_StricmpW(tmp_bstr, L"none") == 0))) { is_visible = false; } //Check if the object has the style visibility:hidden. - if((is_visible && (style->get_visibility(tmp_bstr.GetAddress()) != S_OK)) || + if((is_visible && (style->get_visibility(&tmp_bstr) != S_OK)) || (tmp_bstr != NULL && wxCRT_StricmpW(tmp_bstr, L"hidden") == 0)) { is_visible = false; @@ -1007,8 +1007,8 @@ void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_fla if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupContainer, (void **)&pIMC))) { wxCOMPtr ptrBegin, ptrEnd; - wxBSTR attr_bstr(L"style=\"background-color:#ffff00\""); - wxBSTR text_bstr(text.wc_str()); + BSTR attr_bstr = SysAllocString(L"style=\"background-color:#ffff00\""); + BSTR text_bstr = SysAllocString(text.wc_str()); pIMS->CreateMarkupPointer(&ptrBegin); pIMS->CreateMarkupPointer(&ptrEnd); @@ -1064,6 +1064,9 @@ void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_fla } ptrBegin->MoveToPointer(ptrEnd); } + //Clean up. + SysFreeString(text_bstr); + SysFreeString(attr_bstr); } } }