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