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