[1/2] scrrun: Moved creating filesystem object to its own function
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue Sep 18 22:24:13 CDT 2012
Hi,
Changelog:
scrrun: Moved creating filesystem object to its own function
Best Regards
Alistair Leslie-Hughes
-------------- next part --------------
>From b3d2b41dfa6b39075761d5ef6fcb85f58c267792 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Sun, 23 Sep 2012 11:57:14 +1000
Subject: [PATCH] Moved creating filesystem object to its own function
To: wine-patches <wine-patches at winehq.org>
---
dlls/scrrun/filesystem.c | 4 +-
dlls/scrrun/scrrun.c | 113 ++++++++++++++++++++++++++++++++++--------
dlls/scrrun/scrrun_private.h | 2 +-
3 files changed, 95 insertions(+), 24 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index ade3310..104a032 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -403,9 +403,9 @@ static const struct IFileSystem3Vtbl filesys_vtbl =
static IFileSystem3 filesystem = { &filesys_vtbl };
-HRESULT WINAPI FileSystem_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
+HRESULT create_filesystem(REFIID riid, LPVOID *ppv )
{
- TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
+ TRACE("(%s %p)\n", debugstr_guid(riid), ppv);
return IFileSystem3_QueryInterface(&filesystem, riid, ppv);
}
diff --git a/dlls/scrrun/scrrun.c b/dlls/scrrun/scrrun.c
index d5ea369..2558b30 100644
--- a/dlls/scrrun/scrrun.c
+++ b/dlls/scrrun/scrrun.c
@@ -35,22 +35,34 @@ WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
static HINSTANCE scrrun_instance;
-typedef HRESULT (*fnCreateInstance)(LPVOID *ppObj);
+typedef HRESULT (*fnCreateInstance)(REFIID riid, LPVOID *ppObj);
+
+typedef struct scrruncf
+{
+ IClassFactory IClassFactory_iface;
+ LONG ref;
+
+ fnCreateInstance pfnCreateInstance;
+
+ CLSID clsid;
+} scrruncf;
+
+static inline scrruncf *impl_from_IClassFactory( IClassFactory *iface )
+{
+ return CONTAINING_RECORD(iface, scrruncf, IClassFactory_iface);
+}
static HRESULT WINAPI scrruncf_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppv )
{
+ TRACE("%s %p\n", debugstr_guid(riid), ppv);
+
*ppv = NULL;
- if(IsEqualGUID(&IID_IUnknown, riid)) {
- TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
- *ppv = iface;
- }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
- TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
+ if(IsEqualGUID(&IID_IUnknown, riid) ||
+ IsEqualGUID(&IID_IClassFactory, riid))
+ {
+ IClassFactory_AddRef( iface );
*ppv = iface;
- }
-
- if(*ppv) {
- IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
@@ -60,14 +72,55 @@ static HRESULT WINAPI scrruncf_QueryInterface(IClassFactory *iface, REFIID riid,
static ULONG WINAPI scrruncf_AddRef(IClassFactory *iface )
{
- TRACE("(%p)\n", iface);
- return 2;
+ scrruncf *This = impl_from_IClassFactory(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("%p ref=%u\n", This, ref);
+
+ return ref;
}
static ULONG WINAPI scrruncf_Release(IClassFactory *iface )
{
- TRACE("(%p)\n", iface);
- return 1;
+ scrruncf *This = impl_from_IClassFactory(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("%p ref=%u\n", This, ref);
+
+ if (ref == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI scrruncf_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
+{
+ scrruncf *This = impl_from_IClassFactory( iface );
+ HRESULT hr;
+ IUnknown *punk;
+
+ TRACE("%p %s %p\n", outer, debugstr_guid(riid), ppv );
+
+ *ppv = NULL;
+
+ if (outer)
+ return CLASS_E_NOAGGREGATION;
+
+ hr = This->pfnCreateInstance( &This->clsid, (LPVOID*) &punk );
+ if (SUCCEEDED(hr))
+ {
+ hr = IUnknown_QueryInterface( punk, riid, ppv );
+
+ IUnknown_Release( punk );
+ }
+ else
+ {
+ WARN("Cannot create an instance object. 0x%08x\n", hr);
+ }
+
+ return hr;
}
static HRESULT WINAPI scrruncf_LockServer(IClassFactory *iface, BOOL fLock)
@@ -81,12 +134,10 @@ static const struct IClassFactoryVtbl scrruncf_vtbl =
scrruncf_QueryInterface,
scrruncf_AddRef,
scrruncf_Release,
- FileSystem_CreateInstance,
+ scrruncf_CreateInstance,
scrruncf_LockServer
};
-static IClassFactory FileSystemFactory = { &scrruncf_vtbl };
-
static ITypeLib *typelib;
static ITypeInfo *typeinfos[LAST_tid];
@@ -194,13 +245,33 @@ HRESULT WINAPI DllUnregisterServer(void)
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
+ scrruncf *This;
+ HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
+
+ TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+ if(!ppv)
+ return E_INVALIDARG;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(scrruncf));
+
+ This->IClassFactory_iface.lpVtbl = &scrruncf_vtbl;
+ This->pfnCreateInstance = NULL;
+ This->ref = 1;
+
if(IsEqualGUID(&CLSID_FileSystemObject, rclsid)) {
- TRACE("(CLSID_WshShell %s %p)\n", debugstr_guid(riid), ppv);
- return IClassFactory_QueryInterface(&FileSystemFactory, riid, ppv);
+ TRACE("(CLSID_FileSystemObject %s %p)\n", debugstr_guid(riid), ppv);
+ This->pfnCreateInstance = &create_filesystem;
+ This->clsid = IID_IFileSystem3;
+ }
+
+ if(This->pfnCreateInstance != NULL)
+ {
+ hr = IClassFactory_QueryInterface( &This->IClassFactory_iface, riid, ppv );
+ IClassFactory_Release(&This->IClassFactory_iface);
}
- FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- return CLASS_E_CLASSNOTAVAILABLE;
+ return hr;
}
/***********************************************************************
diff --git a/dlls/scrrun/scrrun_private.h b/dlls/scrrun/scrrun_private.h
index fc700a6..100f4c0 100644
--- a/dlls/scrrun/scrrun_private.h
+++ b/dlls/scrrun/scrrun_private.h
@@ -18,7 +18,7 @@
#ifndef _SCRRUN_PRIVATE_H_
#define _SCRRUN_PRIVATE_H
-extern HRESULT WINAPI FileSystem_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
+extern HRESULT create_filesystem(REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
typedef enum tid_t
{
--
1.7.9.5
More information about the wine-patches
mailing list