From ceee3ddf472c4ab6908f82583a71f57ad1b8f554 Mon Sep 17 00:00:00 2001 From: Hans Leidekker <hans@codeweavers.com> Date: Tue, 14 Jul 2009 12:28:29 +0200 Subject: [PATCH] wmiutils: Add class factory. --- dlls/wmiutils/main.c | 104 ++++++++++++++++++++++++++++++++++++ dlls/wmiutils/wmiutils.spec | 4 +- 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/dlls/wmiutils/main.c b/dlls/wmiutils/main.c index 8e8b005c5fa..6dda4bce6f1 100644 --- a/dlls/wmiutils/main.c +++ b/dlls/wmiutils/main.c @@ -19,14 +19,98 @@ #include "config.h" #include <stdarg.h> +#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "objbase.h" +#include "wbemcli.h" #include "wine/debug.h" +#include "wmiutils_private.h" WINE_DEFAULT_DEBUG_CHANNEL(wmiutils); +typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj ); + +typedef struct +{ + const struct IClassFactoryVtbl *vtbl; + fnCreateInstance pfnCreateInstance; +} wmiutils_cf; + +static inline wmiutils_cf *impl_from_IClassFactory( IClassFactory *iface ) +{ + return (wmiutils_cf *)((char *)iface - FIELD_OFFSET( wmiutils_cf, vtbl )); +} + +static HRESULT WINAPI wmiutils_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) +{ + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IClassFactory)) + { + IClassFactory_AddRef( iface ); + *ppobj = iface; + return S_OK; + } + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI wmiutils_cf_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI wmiutils_cf_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI wmiutils_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj ) +{ + wmiutils_cf *This = impl_from_IClassFactory( iface ); + HRESULT r; + IUnknown *punk; + + TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if (pOuter) + return CLASS_E_NOAGGREGATION; + + r = This->pfnCreateInstance( pOuter, (LPVOID *)&punk ); + if (FAILED(r)) + return r; + + r = IUnknown_QueryInterface( punk, riid, ppobj ); + if (FAILED(r)) + return r; + + IUnknown_Release( punk ); + return r; +} + +static HRESULT WINAPI wmiutils_cf_LockServer( IClassFactory *iface, BOOL dolock ) +{ + FIXME("(%p)->(%d)\n", iface, dolock); + return S_OK; +} + +static const struct IClassFactoryVtbl wmiutils_cf_vtbl = +{ + wmiutils_cf_QueryInterface, + wmiutils_cf_AddRef, + wmiutils_cf_Release, + wmiutils_cf_CreateInstance, + wmiutils_cf_LockServer +}; + +static wmiutils_cf status_code_cf = { &wmiutils_cf_vtbl, WbemStatusCodeText_create }; + BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv ) { switch(reason) @@ -41,3 +125,23 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv ) } return TRUE; } + +HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) +{ + IClassFactory *cf = NULL; + + TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); + + if (IsEqualGUID( rclsid, &CLSID_WbemStatusCode )) + { + cf = (IClassFactory *)&status_code_cf.vtbl; + } + if (!cf) return CLASS_E_CLASSNOTAVAILABLE; + return IClassFactory_QueryInterface( cf, iid, ppv ); +} + +HRESULT WINAPI DllCanUnloadNow( void ) +{ + FIXME("\n"); + return S_FALSE; +} diff --git a/dlls/wmiutils/wmiutils.spec b/dlls/wmiutils/wmiutils.spec index c5fc87af6d5..c534b4fbf40 100644 --- a/dlls/wmiutils/wmiutils.spec +++ b/dlls/wmiutils/wmiutils.spec @@ -1,4 +1,4 @@ -@ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stub DllRegisterServer @ stub DllUnregisterServer