From 3d3d18cfd0bcae7acf20453b3f63667ae69bb70a Mon Sep 17 00:00:00 2001 From: Louis Lenders Date: Sun, 5 Jul 2009 21:45:17 +0200 Subject: wbemprox: add base dlli framework --- dlls/wbemprox/Makefile.in | 2 +- dlls/wbemprox/main.c | 145 +++++++++++++++++++++++++++++++++++++++++++ dlls/wbemprox/wbemprox.spec | 4 +- 3 files changed, 148 insertions(+), 3 deletions(-) diff --git a/dlls/wbemprox/Makefile.in b/dlls/wbemprox/Makefile.in index 58aad37..be1a4a2 100644 --- a/dlls/wbemprox/Makefile.in +++ b/dlls/wbemprox/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = wbemprox.dll -IMPORTS = kernel32 +IMPORTS = uuid ole32 advapi32 user32 kernel32 C_SRCS = \ main.c diff --git a/dlls/wbemprox/main.c b/dlls/wbemprox/main.c index 89812b2..a5a0cc3 100644 --- a/dlls/wbemprox/main.c +++ b/dlls/wbemprox/main.c @@ -20,9 +20,154 @@ #include "config.h" #include +#include + +#define COBJMACROS #include "windef.h" #include "winbase.h" +#include "winreg.h" +#include "shlwapi.h" +#include "shlguid.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wbemprox); + +LONG WBEMPROX_refCount = 0; + +HINSTANCE WBEMPROX_hinstance = 0; + +typedef HRESULT (*LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut); + +static const struct { + REFCLSID clsid; + LPFNCONSTRUCTOR ctor; +} ClassesTable[] = { + {NULL, NULL} +}; + +typedef struct tagClassFactory +{ + const IClassFactoryVtbl *vtbl; + LONG ref; + LPFNCONSTRUCTOR ctor; +} ClassFactory; + +static void ClassFactory_Destructor(ClassFactory *This) +{ + TRACE("Destroying class factory %p\n", This); + HeapFree(GetProcessHeap(),0,This); + WBEMPROX_refCount--; +} + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppvOut) +{ + *ppvOut = NULL; + if (IsEqualIID(riid, &IID_IClassFactory) || IsEqualIID(riid, &IID_IUnknown)) { + IClassFactory_AddRef(iface); + *ppvOut = iface; + return S_OK; + } + + WARN("Unknown interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + ClassFactory *This = (ClassFactory *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + ClassFactory *This = (ClassFactory *)iface; + ULONG ret = InterlockedDecrement(&This->ref); + + if (ret == 0) + ClassFactory_Destructor(This); + return ret; +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) +{ + ClassFactory *This = (ClassFactory *)iface; + HRESULT ret; + IUnknown *obj; + + TRACE("(%p, %p, %s, %p)\n", iface, punkOuter, debugstr_guid(iid), ppvOut); + ret = This->ctor(punkOuter, &obj); + if (FAILED(ret)) + return ret; + ret = IUnknown_QueryInterface(obj, iid, ppvOut); + IUnknown_Release(obj); + return ret; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + ClassFactory *This = (ClassFactory *)iface; + + TRACE("(%p)->(%x)\n", This, fLock); + + if(fLock) + InterlockedIncrement(&WBEMPROX_refCount); + else + InterlockedDecrement(&WBEMPROX_refCount); + + return S_OK; +} + +static const IClassFactoryVtbl ClassFactoryVtbl = { + /* IUnknown */ + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + + /* IClassFactory*/ + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) +{ + ClassFactory *This = HeapAlloc(GetProcessHeap(),0,sizeof(ClassFactory)); + This->vtbl = &ClassFactoryVtbl; + This->ref = 1; + This->ctor = ctor; + *ppvOut = (LPVOID)This; + TRACE("Created class factory %p\n", This); + WBEMPROX_refCount++; + return S_OK; +} + +/************************************************************************* + * DllCanUnloadNow (WBEMPROX.@) + */ +HRESULT WINAPI DllCanUnloadNow(void) +{ + return WBEMPROX_refCount ? S_FALSE : S_OK; +} + +/*********************************************************************** + * DllGetClassObject (WBEMPROX.@) + */ +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut) +{ + int i; + + *ppvOut = NULL; + if (!IsEqualIID(iid, &IID_IUnknown) && !IsEqualIID(iid, &IID_IClassFactory)) + return E_NOINTERFACE; + + for (i = 0; ClassesTable[i].clsid != NULL; i++) + if (IsEqualCLSID(ClassesTable[i].clsid, clsid)) { + return ClassFactory_Constructor(ClassesTable[i].ctor, ppvOut); + } + FIXME("CLSID %s not supported\n", debugstr_guid(clsid)); + return CLASS_E_CLASSNOTAVAILABLE; +} BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { diff --git a/dlls/wbemprox/wbemprox.spec b/dlls/wbemprox/wbemprox.spec index c5fc87a..c534b4f 100644 --- a/dlls/wbemprox/wbemprox.spec +++ b/dlls/wbemprox/wbemprox.spec @@ -1,4 +1,4 @@ -@ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stub DllRegisterServer @ stub DllUnregisterServer -- 1.6.0.4