Huw Davies : ole32: Defer releasing the delegate interfaces until after we return from an OnClose notification .
Alexandre Julliard
julliard at winehq.org
Tue Nov 25 07:21:39 CST 2008
Module: wine
Branch: master
Commit: 8355eeaa2191423f2bf8ec3355f99a04a104cece
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8355eeaa2191423f2bf8ec3355f99a04a104cece
Author: Huw Davies <huw at codeweavers.com>
Date: Mon Nov 24 15:56:08 2008 +0000
ole32: Defer releasing the delegate interfaces until after we return from an OnClose notification.
---
dlls/ole32/defaulthandler.c | 21 +++++++++++++++++++--
1 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/dlls/ole32/defaulthandler.c b/dlls/ole32/defaulthandler.c
index ae36201..5c6f9b2 100644
--- a/dlls/ole32/defaulthandler.c
+++ b/dlls/ole32/defaulthandler.c
@@ -71,6 +71,12 @@ enum storage_state
storage_state_loaded
};
+enum object_state
+{
+ object_state_not_running,
+ object_state_running
+};
+
/****************************************************************************
* DefaultHandler
*
@@ -123,6 +129,7 @@ struct DefaultHandler
IPersistStorage *pPSDelegate;
/* IDataObject delegate */
IDataObject *pDataDelegate;
+ enum object_state object_state;
/* connection cookie for the advise on the delegate OLE object */
DWORD dwAdvConn;
@@ -452,7 +459,7 @@ static void DefaultHandler_Stop(DefaultHandler *This)
if (This->dataAdviseHolder)
DataAdviseHolder_OnDisconnect(This->dataAdviseHolder);
- release_delegates(This);
+ This->object_state = object_state_not_running;
}
/************************************************************************
@@ -478,6 +485,7 @@ static HRESULT WINAPI DefaultHandler_Close(
hr = IOleObject_Close(This->pOleDelegate, dwSaveOption);
DefaultHandler_Stop(This);
+ release_delegates(This);
return hr;
}
@@ -1305,11 +1313,15 @@ static HRESULT WINAPI DefaultHandler_Run(
if (object_is_running(This))
return S_OK;
+ release_delegates(This);
+
hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_LOCAL_SERVER,
&IID_IOleObject, (void **)&This->pOleDelegate);
if (FAILED(hr))
return hr;
+ This->object_state = object_state_running;
+
hr = IOleObject_Advise(This->pOleDelegate,
(IAdviseSink *)&This->lpvtblIAdviseSink,
&This->dwAdvConn);
@@ -1348,7 +1360,10 @@ static HRESULT WINAPI DefaultHandler_Run(
hr = DataAdviseHolder_OnConnect(This->dataAdviseHolder, This->pDataDelegate);
if (FAILED(hr))
+ {
DefaultHandler_Stop(This);
+ release_delegates(This);
+ }
return hr;
}
@@ -1365,7 +1380,7 @@ static BOOL WINAPI DefaultHandler_IsRunning(
TRACE("()\n");
- if (This->pOleDelegate)
+ if (This->object_state == object_state_running)
return TRUE;
else
return FALSE;
@@ -1943,6 +1958,7 @@ static DefaultHandler* DefaultHandler_Construct(
This->pOleDelegate = NULL;
This->pPSDelegate = NULL;
This->pDataDelegate = NULL;
+ This->object_state = object_state_not_running;
This->dwAdvConn = 0;
This->storage = NULL;
@@ -1956,6 +1972,7 @@ static void DefaultHandler_Destroy(
{
/* release delegates */
DefaultHandler_Stop(This);
+ release_delegates(This);
HeapFree( GetProcessHeap(), 0, This->containerApp );
This->containerApp = NULL;
More information about the wine-cvs
mailing list