Applied patch #9510: wxIAccessible access freed memory

by Cyball


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62068 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2009-09-24 10:15:20 +00:00
parent e2bc58263e
commit d561e1a5fb

View File

@@ -187,6 +187,9 @@ class wxIAccessible : public IAccessible
public: public:
wxIAccessible(wxAccessible *pAccessible); wxIAccessible(wxAccessible *pAccessible);
// Called to indicate object should prepare to be deleted.
void Quiesce();
DECLARE_IUNKNOWN_METHODS; DECLARE_IUNKNOWN_METHODS;
// IAccessible // IAccessible
@@ -334,6 +337,7 @@ public:
private: private:
wxAccessible *m_pAccessible; // pointer to C++ class we belong to wxAccessible *m_pAccessible; // pointer to C++ class we belong to
bool m_bQuiescing; // Object is to be deleted
wxDECLARE_NO_COPY_CLASS(wxIAccessible); wxDECLARE_NO_COPY_CLASS(wxIAccessible);
}; };
@@ -358,6 +362,15 @@ wxIAccessible::wxIAccessible(wxAccessible *pAccessible)
wxASSERT( pAccessible != NULL ); wxASSERT( pAccessible != NULL );
m_pAccessible = pAccessible; m_pAccessible = pAccessible;
m_bQuiescing = false;
}
// Called to indicate object should prepare to be deleted.
void wxIAccessible::Quiesce()
{
m_bQuiescing = true;
m_pAccessible = NULL;
} }
// Retrieves the child element or child object at a given point on the screen. // Retrieves the child element or child object at a given point on the screen.
@@ -366,7 +379,7 @@ wxIAccessible::wxIAccessible(wxAccessible *pAccessible)
STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID) STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID)
{ {
wxLogTrace(wxT("access"), wxT("accHitTest")); wxLogTrace(wxT("access"), wxT("accHitTest"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -435,7 +448,7 @@ STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID)
STDMETHODIMP wxIAccessible::accLocation ( long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varID) STDMETHODIMP wxIAccessible::accLocation ( long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varID)
{ {
wxLogTrace(wxT("access"), wxT("accLocation")); wxLogTrace(wxT("access"), wxT("accLocation"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -481,7 +494,7 @@ STDMETHODIMP wxIAccessible::accLocation ( long* pxLeft, long* pyTop, long* pcxWi
STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT* pVarEnd) STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT* pVarEnd)
{ {
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
wxLogTrace(wxT("access"), wxString(wxT("accNavigate for ")) + m_pAccessible->GetWindow()->GetClassInfo()->GetClassName()); wxLogTrace(wxT("access"), wxString(wxT("accNavigate for ")) + m_pAccessible->GetWindow()->GetClassInfo()->GetClassName());
@@ -638,7 +651,7 @@ STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT
STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDispChild) STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDispChild)
{ {
wxLogTrace(wxT("access"), wxT("get_accChild")); wxLogTrace(wxT("access"), wxT("get_accChild"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -712,7 +725,7 @@ STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDis
STDMETHODIMP wxIAccessible::get_accChildCount ( long* pCountChildren) STDMETHODIMP wxIAccessible::get_accChildCount ( long* pCountChildren)
{ {
wxLogTrace(wxT("access"), wxT("get_accChildCount")); wxLogTrace(wxT("access"), wxT("get_accChildCount"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -756,7 +769,7 @@ STDMETHODIMP wxIAccessible::get_accChildCount ( long* pCountChildren)
STDMETHODIMP wxIAccessible::get_accParent ( IDispatch** ppDispParent) STDMETHODIMP wxIAccessible::get_accParent ( IDispatch** ppDispParent)
{ {
wxLogTrace(wxT("access"), wxT("get_accParent")); wxLogTrace(wxT("access"), wxT("get_accParent"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -820,7 +833,7 @@ STDMETHODIMP wxIAccessible::get_accParent ( IDispatch** ppDispParent)
STDMETHODIMP wxIAccessible::accDoDefaultAction(VARIANT varID) STDMETHODIMP wxIAccessible::accDoDefaultAction(VARIANT varID)
{ {
wxLogTrace(wxT("access"), wxT("accDoDefaultAction")); wxLogTrace(wxT("access"), wxT("accDoDefaultAction"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -865,7 +878,7 @@ STDMETHODIMP wxIAccessible::accDoDefaultAction(VARIANT varID)
STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefaultAction) STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefaultAction)
{ {
wxLogTrace(wxT("access"), wxT("get_accDefaultAction")); wxLogTrace(wxT("access"), wxT("get_accDefaultAction"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -925,7 +938,7 @@ STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefau
STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescription) STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescription)
{ {
wxLogTrace(wxT("access"), wxT("get_accDescription")); wxLogTrace(wxT("access"), wxT("get_accDescription"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -982,7 +995,7 @@ STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescrip
STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp)
{ {
wxLogTrace(wxT("access"), wxT("get_accHelp")); wxLogTrace(wxT("access"), wxT("get_accHelp"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1042,7 +1055,7 @@ STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp)
STDMETHODIMP wxIAccessible::get_accHelpTopic ( BSTR* pszHelpFile, VARIANT varChild, long* pidTopic) STDMETHODIMP wxIAccessible::get_accHelpTopic ( BSTR* pszHelpFile, VARIANT varChild, long* pidTopic)
{ {
wxLogTrace(wxT("access"), wxT("get_accHelpTopic")); wxLogTrace(wxT("access"), wxT("get_accHelpTopic"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1087,7 +1100,7 @@ STDMETHODIMP wxIAccessible::get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKe
wxLogTrace(wxT("access"), wxT("get_accKeyboardShortcut")); wxLogTrace(wxT("access"), wxT("get_accKeyboardShortcut"));
*pszKeyboardShortcut = NULL; *pszKeyboardShortcut = NULL;
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1146,7 +1159,7 @@ STDMETHODIMP wxIAccessible::get_accName ( VARIANT varID, BSTR* pszName)
wxLogTrace(wxT("access"), wxT("get_accName")); wxLogTrace(wxT("access"), wxT("get_accName"));
*pszName = NULL; *pszName = NULL;
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1197,7 +1210,7 @@ STDMETHODIMP wxIAccessible::get_accName ( VARIANT varID, BSTR* pszName)
STDMETHODIMP wxIAccessible::get_accRole ( VARIANT varID, VARIANT* pVarRole) STDMETHODIMP wxIAccessible::get_accRole ( VARIANT varID, VARIANT* pVarRole)
{ {
wxLogTrace(wxT("access"), wxT("get_accRole")); wxLogTrace(wxT("access"), wxT("get_accRole"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1257,7 +1270,7 @@ STDMETHODIMP wxIAccessible::get_accRole ( VARIANT varID, VARIANT* pVarRole)
STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState) STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState)
{ {
wxLogTrace(wxT("access"), wxT("get_accState")); wxLogTrace(wxT("access"), wxT("get_accState"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1308,7 +1321,7 @@ STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState)
STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue) STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue)
{ {
wxLogTrace(wxT("access"), wxT("get_accValue")); wxLogTrace(wxT("access"), wxT("get_accValue"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1360,7 +1373,7 @@ STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue)
STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID ) STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID )
{ {
wxLogTrace(wxT("access"), wxT("get_accSelect")); wxLogTrace(wxT("access"), wxT("get_accSelect"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1407,7 +1420,7 @@ STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID )
STDMETHODIMP wxIAccessible::get_accFocus ( VARIANT* pVarID) STDMETHODIMP wxIAccessible::get_accFocus ( VARIANT* pVarID)
{ {
wxLogTrace(wxT("access"), wxT("get_accFocus")); wxLogTrace(wxT("access"), wxT("get_accFocus"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1474,7 +1487,7 @@ STDMETHODIMP wxIAccessible::get_accSelection ( VARIANT * pVarChildren)
{ {
#if wxUSE_VARIANT #if wxUSE_VARIANT
wxLogTrace(wxT("access"), wxT("get_accSelection")); wxLogTrace(wxT("access"), wxT("get_accSelection"));
wxASSERT (m_pAccessible != NULL); wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) );
if (!m_pAccessible) if (!m_pAccessible)
return E_FAIL; return E_FAIL;
@@ -1706,6 +1719,7 @@ wxAccessible::wxAccessible(wxWindow* win)
wxAccessible::~wxAccessible() wxAccessible::~wxAccessible()
{ {
m_pIAccessible->Quiesce();
m_pIAccessible->Release(); m_pIAccessible->Release();
if (m_pIAccessibleStd) if (m_pIAccessibleStd)
((IAccessible*)m_pIAccessibleStd)->Release(); ((IAccessible*)m_pIAccessibleStd)->Release();