/*++ Copyright (C) 1995-2001 Microsoft Corporation Module Name: STDPROV.CPP Abstract: Contains DLL entry points. Also has code that controls when the DLL can be unloaded by tracking the number of object. Also holds various utility classes and functions. History: a-davj 9-27-95 Created. --*/ #include "precomp.h" #include #include #include "cvariant.h" #include "cfdyn.h" #include "provreg.h" #include "provperf.h" #include // Count number of objects and number of locks so DLL can know when to unload long lObj = 0; long lLock = 0; HINSTANCE ghModule = NULL; //*************************************************************************** // // BOOL WINAPI DllMain // // DESCRIPTION: // // Entry point for DLL. Good place for initialization. // // PARAMETERS: // // hInstance instance handle // ulReason why we are being called // pvReserved reserved // // RETURN VALUE: // // TRUE if OK. // //*************************************************************************** BOOL WINAPI DllMain( IN HINSTANCE hInstance, IN ULONG ulReason, LPVOID pvReserved) { if(ghModule == NULL) { ghModule = hInstance; } if (DLL_PROCESS_DETACH==ulReason) { return TRUE; } else if (DLL_PROCESS_ATTACH==ulReason) { return TRUE; } return TRUE; } //*************************************************************************** // // STDAPI DllGetClassObject // // DESCRIPTION: // // Called when Ole wants a class factory. Return one only if it is the sort // of class this DLL supports. // // PARAMETERS: // // rclsid CLSID of the object that is desired. // riid ID of the desired interface. // ppv Set to the class factory. // // RETURN VALUE: // // S_OK all is well // E_FAILED not something we support // E_OUTOFMEMORY out of memory // //*************************************************************************** STDAPI DllGetClassObject( IN REFCLSID rclsid, IN REFIID riid, OUT PPVOID ppv) { HRESULT hr; // CCFDyn *pObj; IClassFactory *pObj; // **** FOR EACH PROVIDER *** if (CLSID_RegProvider ==rclsid) pObj=new CCFReg(); else if (CLSID_RegPropProv ==rclsid) pObj=new CCFRegProp(); else if (CLSID_PerfProvider ==rclsid) pObj=new CCFPerf(); else if (CLSID_PerfPropProv ==rclsid) pObj=new CCFPerfProp(); else if (CLSID_RegistryEventProvider ==rclsid) pObj=new CRegEventProviderFactory; else return ResultFromScode(E_FAIL); // **** FOR EACH PROVIDER *** if (NULL==pObj) return ResultFromScode(E_OUTOFMEMORY); hr=pObj->QueryInterface(riid, ppv); if (FAILED(hr)) delete pObj; return hr; } //*************************************************************************** // // STDAPI DllCanUnloadNow // // DESCRIPTION: // // Answers if the DLL can be freed, that is, if there are no // references to anything this DLL provides. // // RETURN VALUE: // // S_OK if it is OK to unload // S_FALSE if still in use // //*************************************************************************** STDAPI DllCanUnloadNow(void) { if(lLock == 0 && lObj == 0) return S_OK; else return S_FALSE; } //*************************************************************************** // // DllRegisterServer // // Purpose: Called during setup or by regsvr32. // // Return: NOERROR if registration successful, error otherwise. //*************************************************************************** STDAPI DllRegisterServer(void) { RegisterDLL(ghModule, CLSID_RegProvider, __TEXT("WBEM Registry Instance Provider"), __TEXT("Both"), NULL); RegisterDLL(ghModule, CLSID_RegPropProv, __TEXT("WBEM Registry Property Provider"), __TEXT("Both"), NULL); if(IsNT()) { RegisterDLL(ghModule, CLSID_PerfProvider, __TEXT("WBEM PerfMon Instance Provider"), __TEXT("Both"), NULL); RegisterDLL(ghModule, CLSID_PerfPropProv, __TEXT("WBEM PerfMon Property Provider"), __TEXT("Both"), NULL); } RegisterDLL(ghModule, CLSID_RegistryEventProvider, __TEXT("WBEM Registry Event Provider"), __TEXT("Both"), NULL); return S_OK; } //*************************************************************************** // // DllUnregisterServer // // Purpose: Called when it is time to remove the registry entries. // // Return: NOERROR if registration successful, error otherwise. //*************************************************************************** STDAPI DllUnregisterServer(void) { UnRegisterDLL(CLSID_RegProvider, NULL); UnRegisterDLL(CLSID_RegPropProv, NULL); UnRegisterDLL(CLSID_PerfProvider, NULL); UnRegisterDLL(CLSID_PerfPropProv, NULL); UnRegisterDLL(CLSID_RegistryEventProvider, NULL); return NOERROR; }