Huw Davies : ole32: Implement OleCreateEmbeddingHelper.

Alexandre Julliard julliard at winehq.org
Fri Jun 26 09:47:07 CDT 2009


Module: wine
Branch: master
Commit: e67da1171661660bd73403d03c86be1117d4289c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e67da1171661660bd73403d03c86be1117d4289c

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Jun 25 15:15:50 2009 +0100

ole32: Implement OleCreateEmbeddingHelper.

Based on a patch by Rob Shearman.

---

 dlls/ole32/defaulthandler.c |   69 +++++++++++++++++++++++++++++++++++++++---
 dlls/ole32/ole32.spec       |    2 +-
 2 files changed, 65 insertions(+), 6 deletions(-)

diff --git a/dlls/ole32/defaulthandler.c b/dlls/ole32/defaulthandler.c
index b85002a..4102d50 100644
--- a/dlls/ole32/defaulthandler.c
+++ b/dlls/ole32/defaulthandler.c
@@ -137,6 +137,11 @@ struct DefaultHandler
   /* storage passed to Load or InitNew */
   IStorage *storage;
   enum storage_state storage_state;
+
+  /* optional class factory for object */
+  IClassFactory *pCFObject;
+  /* TRUE if acting as an inproc server instead of an inproc handler */
+  BOOL inproc_server;
 };
 
 typedef struct DefaultHandler DefaultHandler;
@@ -223,6 +228,12 @@ static HRESULT WINAPI DefaultHandler_NDIUnknown_QueryInterface(
     if (FAILED(hr)) FIXME("interface %s not implemented by data cache\n", debugstr_guid(riid));
     return hr;
   }
+  else if (This->inproc_server && This->pOleDelegate)
+  {
+    HRESULT hr = IUnknown_QueryInterface(This->pOleDelegate, riid, ppvObject);
+    if (SUCCEEDED(hr))
+      return hr;
+  }
 
   /* Check that we obtained an interface. */
   if (*ppvObject == NULL)
@@ -1901,7 +1912,9 @@ static const IPersistStorageVtbl DefaultHandler_IPersistStorage_VTable =
  */
 static DefaultHandler* DefaultHandler_Construct(
   REFCLSID  clsid,
-  LPUNKNOWN pUnkOuter)
+  LPUNKNOWN pUnkOuter,
+  DWORD flags,
+  IClassFactory *pCF)
 {
   DefaultHandler* This = NULL;
   HRESULT hr;
@@ -1918,6 +1931,8 @@ static DefaultHandler* DefaultHandler_Construct(
   This->lpvtblIAdviseSink = &DefaultHandler_IAdviseSink_VTable;
   This->lpvtblIPersistStorage = &DefaultHandler_IPersistStorage_VTable;
 
+  This->inproc_server = (flags & EMBDHLP_INPROC_SERVER) ? TRUE : FALSE;
+
   /*
    * Start with one reference count. The caller of this function
    * must release the interface pointer when it is done.
@@ -1964,6 +1979,30 @@ static DefaultHandler* DefaultHandler_Construct(
   This->storage = NULL;
   This->storage_state = storage_state_uninitialised;
 
+  if (This->inproc_server && !(flags & EMBDHLP_DELAYCREATE))
+  {
+    HRESULT hr;
+    This->pCFObject = NULL;
+    if (pCF)
+      hr = IClassFactory_CreateInstance(pCF, NULL, &IID_IOleObject, (void **)&This->pOleDelegate);
+    else
+      hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
+                            &IID_IOleObject, (void **)&This->pOleDelegate);
+    if (SUCCEEDED(hr))
+      hr = IOleObject_QueryInterface(This->pOleDelegate, &IID_IPersistStorage, (void **)&This->pPSDelegate);
+    if (SUCCEEDED(hr))
+      hr = IOleObject_QueryInterface(This->pOleDelegate, &IID_IDataObject, (void **)&This->pDataDelegate);
+    if (SUCCEEDED(hr))
+      This->object_state = object_state_running;
+    if (FAILED(hr))
+      WARN("object creation failed with error %08x\n", hr);
+  }
+  else
+  {
+    This->pCFObject = pCF;
+    if (pCF) IClassFactory_AddRef(pCF);
+  }
+
   return This;
 }
 
@@ -2011,22 +2050,30 @@ static void DefaultHandler_Destroy(
     This->storage = NULL;
   }
 
+  if (This->pCFObject)
+  {
+    IClassFactory_Release(This->pCFObject);
+    This->pCFObject = NULL;
+  }
+
   HeapFree(GetProcessHeap(), 0, This);
 }
 
 /******************************************************************************
- * OleCreateDefaultHandler [OLE32.@]
+ * OleCreateEmbeddingHelper [OLE32.@]
  */
-HRESULT WINAPI OleCreateDefaultHandler(
+HRESULT WINAPI OleCreateEmbeddingHelper(
   REFCLSID  clsid,
   LPUNKNOWN pUnkOuter,
+  DWORD     flags,
+  IClassFactory *pCF,
   REFIID    riid,
   LPVOID*   ppvObj)
 {
   DefaultHandler* newHandler = NULL;
   HRESULT         hr         = S_OK;
 
-  TRACE("(%s, %p, %s, %p)\n", debugstr_guid(clsid), pUnkOuter, debugstr_guid(riid), ppvObj);
+  TRACE("(%s, %p, %08x, %p, %s, %p)\n", debugstr_guid(clsid), pUnkOuter, flags, pCF, debugstr_guid(riid), ppvObj);
 
   if (!ppvObj)
     return E_POINTER;
@@ -2045,7 +2092,7 @@ HRESULT WINAPI OleCreateDefaultHandler(
   /*
    * Try to construct a new instance of the class.
    */
-  newHandler = DefaultHandler_Construct(clsid, pUnkOuter);
+  newHandler = DefaultHandler_Construct(clsid, pUnkOuter, flags, pCF);
 
   if (!newHandler)
     return E_OUTOFMEMORY;
@@ -2063,3 +2110,15 @@ HRESULT WINAPI OleCreateDefaultHandler(
 
   return hr;
 }
+
+
+/******************************************************************************
+ * OleCreateDefaultHandler [OLE32.@]
+ */
+HRESULT WINAPI OleCreateDefaultHandler(REFCLSID clsid, LPUNKNOWN pUnkOuter,
+                                       REFIID riid, LPVOID* ppvObj)
+{
+    TRACE("(%s, %p, %s, %p)\n", debugstr_guid(clsid), pUnkOuter,debugstr_guid(riid), ppvObj);
+    return OleCreateEmbeddingHelper(clsid, pUnkOuter, EMBDHLP_INPROC_HANDLER | EMBDHLP_CREATENOW,
+                                    NULL, riid, ppvObj);
+}
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index b9e5c4c..97f2f3d 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -180,7 +180,7 @@
 @ stub OleConvertOLESTREAMToIStorageEx
 @ stdcall OleCreate(ptr ptr long ptr ptr ptr ptr)
 @ stdcall OleCreateDefaultHandler(ptr ptr ptr ptr)
-@ stub OleCreateEmbeddingHelper
+@ stdcall OleCreateEmbeddingHelper(ptr ptr long ptr ptr ptr)
 @ stub OleCreateEx
 @ stdcall OleCreateFromData(ptr ptr long ptr ptr ptr ptr)
 @ stdcall OleCreateFromDataEx(ptr ptr long long long ptr ptr ptr ptr ptr ptr ptr)




More information about the wine-cvs mailing list