//+------------------------------------------------------------------- // // File: dlltest.cxx // // Contents: This file contins the DLL entry points // LibMain // DllGetClassObject (Bindings key func) // CAdvBndCF (class factory) // CAdvBnd (actual class implementation) // // Classes: CAdvBndCF, CAdvBnd // // // History: 30-Nov-92 SarahJ Created // //--------------------------------------------------------------------- #include #include // #include #include #include static GUID CLSID_TestNoRegister = {0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x52}}; static GUID CLSID_TestRegister = {0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x53}}; // The class objects can be totally static in a DLL CActClassFactory clsfactNoRegister(CLSID_TestNoRegister, FALSE); CActClassFactory clsfactRegister(CLSID_TestRegister, FALSE); CMutexSem mxsUnloadTest; BOOL fUnload = FALSE; DWORD dwRegistration; ULONG gUsage = 0; extern "C" BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID pvReserved) { return TRUE; } void GlobalRefs(BOOL fAddRef) { if (fAddRef) { gUsage++; } else { gUsage--; } } STDAPI DllCanUnloadNow(void) { CLock clk(mxsUnloadTest); if (gUsage == 0) { fUnload = TRUE; if (dwRegistration != 0) { HRESULT hr = CoRevokeClassObject(dwRegistration); Win4Assert(SUCCEEDED(hr) && "CoRevokeClassObject failed!!"); } } return (gUsage == 0); } STDAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void FAR* FAR* ppv) { CLock clk(mxsUnloadTest); if (fUnload) { return E_UNEXPECTED; } if (IsEqualCLSID(clsid, CLSID_TestNoRegister)) { clsfactNoRegister.AddRef(); *ppv = &clsfactNoRegister; } else if (IsEqualCLSID(clsid, CLSID_TestRegister)) { clsfactNoRegister.AddRef(); *ppv = &clsfactNoRegister; if (dwRegistration == 0) { // Register the class HRESULT hr = CoRegisterClassObject(CLSID_TestRegister, &clsfactRegister, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegistration); Win4Assert(SUCCEEDED(hr) && "CoRegisterClassObject failed!!"); // Decrement the global reference count since the registration // bumped the reference count because it does an addref gUsage--; } } else { return E_UNEXPECTED; } return S_OK; }