Robert Shearman : ole32: Add a class factory for CLSID_InProcFreeMarshaler.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 25 04:16:18 CDT 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Wed May 24 23:02:35 2006 +0100

ole32: Add a class factory for CLSID_InProcFreeMarshaler.

---

 dlls/ole32/compobj.c         |    3 ++
 dlls/ole32/compobj_private.h |    1 +
 dlls/ole32/ftmarshal.c       |   65 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index f2a587f..d241bfb 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -1642,6 +1642,9 @@ HRESULT WINAPI CoGetClassObject(
         static const WCHAR wszInprocServer32[] = {'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
         HKEY hkey;
 
+        if (IsEqualCLSID(rclsid, &CLSID_InProcFreeMarshaler))
+            return FTMarshalCF_Create(iid, ppv);
+
         hres = COM_OpenKeyForCLSID(rclsid, wszInprocServer32, KEY_READ, &hkey);
         if (FAILED(hres))
         {
diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h
index 2237469..f9fac80 100644
--- a/dlls/ole32/compobj_private.h
+++ b/dlls/ole32/compobj_private.h
@@ -178,6 +178,7 @@ extern HRESULT WINE_StringFromCLSID(cons
 
 HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *key);
 HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
+HRESULT FTMarshalCF_Create(REFIID riid, LPVOID *ppv);
 
 /* Stub Manager */
 
diff --git a/dlls/ole32/ftmarshal.c b/dlls/ole32/ftmarshal.c
index a0befee..9f41f65 100644
--- a/dlls/ole32/ftmarshal.c
+++ b/dlls/ole32/ftmarshal.c
@@ -325,3 +325,68 @@ HRESULT WINAPI CoCreateFreeThreadedMarsh
     *ppunkMarshal = _IFTMUnknown_ (ftm);
     return S_OK;
 }
+
+static HRESULT WINAPI FTMarshalCF_QueryInterface(LPCLASSFACTORY iface,
+                                                  REFIID riid, LPVOID *ppv)
+{
+    *ppv = NULL;
+    if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
+    {
+        *ppv = iface;
+        IUnknown_AddRef(iface);
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI FTMarshalCF_AddRef(LPCLASSFACTORY iface)
+{
+    return 2; /* non-heap based object */
+}
+
+static ULONG WINAPI FTMarshalCF_Release(LPCLASSFACTORY iface)
+{
+    return 1; /* non-heap based object */
+}
+
+static HRESULT WINAPI FTMarshalCF_CreateInstance(LPCLASSFACTORY iface,
+    LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv)
+{
+    IUnknown *pUnknown;
+    HRESULT  hr;
+
+    TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv);
+
+    *ppv = NULL;
+
+    hr = CoCreateFreeThreadedMarshaler(pUnk, &pUnknown);
+
+    if (SUCCEEDED(hr))
+    {
+        hr = IUnknown_QueryInterface(pUnknown, riid, ppv);
+        IUnknown_Release(pUnknown);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI FTMarshalCF_LockServer(LPCLASSFACTORY iface, BOOL fLock)
+{
+    FIXME("(%d), stub!\n",fLock);
+    return S_OK;
+}
+
+static const IClassFactoryVtbl FTMarshalCFVtbl =
+{
+    FTMarshalCF_QueryInterface,
+    FTMarshalCF_AddRef,
+    FTMarshalCF_Release,
+    FTMarshalCF_CreateInstance,
+    FTMarshalCF_LockServer
+};
+static const IClassFactoryVtbl *FTMarshalCF = &FTMarshalCFVtbl;
+
+HRESULT FTMarshalCF_Create(REFIID riid, LPVOID *ppv)
+{
+    return IClassFactory_QueryInterface((IClassFactory *)&FTMarshalCF, riid, ppv);
+}




More information about the wine-cvs mailing list