diff --git a/dlls/wbemdisp/main.c b/dlls/wbemdisp/main.c index 2ebd986506a..078e3b5f38e 100644 --- a/dlls/wbemdisp/main.c +++ b/dlls/wbemdisp/main.c @@ -18,13 +18,96 @@ #include "config.h" #include + +#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "objbase.h" +#include "wbemdisp.h" #include "rpcproxy.h" +#include "wine/debug.h" +#include "wbemdisp_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp); + static HINSTANCE instance; +struct factory +{ + IClassFactory IClassFactory_iface; + HRESULT (*fnCreateInstance)( IUnknown *, LPVOID * ); +}; + +static inline struct factory *impl_from_IClassFactory( IClassFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct factory, IClassFactory_iface ); +} + +static HRESULT WINAPI factory_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *obj ) +{ + if (IsEqualGUID( riid, &IID_IUnknown ) || IsEqualGUID( riid, &IID_IClassFactory )) + { + IClassFactory_AddRef( iface ); + *obj = iface; + return S_OK; + } + FIXME( "interface %s not implemented\n", debugstr_guid(riid) ); + return E_NOINTERFACE; +} + +static ULONG WINAPI factory_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI factory_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI factory_CreateInstance( IClassFactory *iface, LPUNKNOWN outer, REFIID riid, + LPVOID *obj ) +{ + struct factory *factory = impl_from_IClassFactory( iface ); + IUnknown *unk; + HRESULT hr; + + TRACE( "%p, %s, %p\n", outer, debugstr_guid(riid), obj ); + + *obj = NULL; + if (outer) return CLASS_E_NOAGGREGATION; + + hr = factory->fnCreateInstance( outer, (LPVOID *)&unk ); + if (FAILED( hr )) + return hr; + + hr = IUnknown_QueryInterface( unk, riid, obj ); + if (FAILED( hr )) + return hr; + + IUnknown_Release( unk ); + return hr; +} + +static HRESULT WINAPI factory_LockServer( IClassFactory *iface, BOOL lock ) +{ + FIXME( "%p, %d\n", iface, lock ); + return S_OK; +} + +static const struct IClassFactoryVtbl factory_vtbl = +{ + factory_QueryInterface, + factory_AddRef, + factory_Release, + factory_CreateInstance, + factory_LockServer +}; + +static struct factory swbem_locator_cf = { { &factory_vtbl }, SWbemLocator_create }; + BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) { @@ -40,6 +123,28 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) return TRUE; } +HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *obj ) +{ + IClassFactory *cf = NULL; + + TRACE( "%s, %s, %p\n", debugstr_guid(rclsid), debugstr_guid(iid), obj ); + + if (IsEqualGUID( rclsid, &CLSID_SWbemLocator )) + { + cf = &swbem_locator_cf.IClassFactory_iface; + } + if (!cf) return CLASS_E_CLASSNOTAVAILABLE; + return IClassFactory_QueryInterface( cf, iid, obj ); +} + +/*********************************************************************** + * DllCanUnloadNow (WBEMDISP.@) + */ +HRESULT WINAPI DllCanUnloadNow(void) +{ + return S_FALSE; +} + /*********************************************************************** * DllRegisterServer (WBEMDISP.@) */ diff --git a/dlls/wbemdisp/wbemdisp.spec b/dlls/wbemdisp/wbemdisp.spec index 6d0e061a537..b16365d0c9f 100644 --- a/dlls/wbemdisp/wbemdisp.spec +++ b/dlls/wbemdisp/wbemdisp.spec @@ -1,4 +1,4 @@ -@ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer()