//+--------------------------------------------------------------------- // // File: srfact.cxx // // Contents: Class Factory // // Classes: SRFactory // //------------------------------------------------------------------------ //#pragma warning(disable:4103) #include #include #include #include // common dialog boxes #include #include // the base classes and utilities #include #include "srs.hxx" SRFactory * gpSRFactory = NULL; DWORD gdwRegisterClass = 0; extern "C" BOOL CreateSRClassFactory(HINSTANCE hinst,BOOL fEmbedded) { BOOL fRet = FALSE; if(SRFactory::Create(hinst)) { gpSRFactory->AddRef(); if(fEmbedded) { DOUT(TEXT("SoundRec: Registering SRFactory\r\n")); HRESULT hr = CoRegisterClassObject(CLSID_SOUNDREC, (LPUNKNOWN)(LPCLASSFACTORY)gpSRFactory, CLSCTX_LOCAL_SERVER, //REGCLS_MULTI_SEPARATE, REGCLS_SINGLEUSE, &gdwRegisterClass); if(OK(hr)) { CoLockObjectExternal((LPUNKNOWN)(LPCLASSFACTORY)gpSRFactory, TRUE, TRUE); fRet = TRUE; } #if DBG else { TCHAR achBuffer[256]; wsprintf(achBuffer, TEXT("SoundRec: CoRegisterClassObject (%lx)\r\n"), (long)hr); OutputDebugString(achBuffer); } #endif } else { fRet = TRUE; } } return fRet; } extern "C" HRESULT ReleaseSRClassFactory(void) { HRESULT hr = NOERROR; if(gdwRegisterClass) { #if DBG OutputDebugString(TEXT("SoundRec: Revoking SRFactory\r\n")); #endif CoLockObjectExternal((LPUNKNOWN)(LPCLASSFACTORY)gpSRFactory, FALSE, TRUE); hr = CoRevokeClassObject(gdwRegisterClass); gdwRegisterClass = 0; gpSRFactory->Release(); gpSRFactory = NULL; } return hr; } BOOL SRFactory::Create(HINSTANCE hinst) { gpSRFactory = new SRFactory; // // initialize our classes // if (gpSRFactory == NULL || !gpSRFactory->Init(hinst) || !SRCtrl::ClassInit(gpSRFactory->_pClass) || !SRDV::ClassInit(gpSRFactory->_pClass) || !SRInPlace::ClassInit(gpSRFactory->_pClass)) { return FALSE; } return TRUE; } //+--------------------------------------------------------------- // // Member: SRFactory:::Init // // Synopsis: Initializes the class factory // // Arguments: [hinst] -- instance handle of the module with // class descriptor resources // // Returns: TRUE iff the factory was successfully initialized // //---------------------------------------------------------------- BOOL SRFactory::Init(HINSTANCE hinst) { // // Register the standard OLE clipboard formats. // These are available in the OleClipFormat array. // RegisterOleClipFormats(); if((_pClass = new ClassDescriptor) == NULL) return FALSE; BOOL fRet = _pClass->Init(hinst, 0); //IDS_CLASSID); // // Patch _pClass->_haccel with a resource reload // (for InPlace) due to mismatch between the base class // resource scheme and legacy code... // if(fRet) { if((_pClass->_haccel = LoadAccelerators(hinst, TEXT("SOUNDREC"))) == NULL) fRet = FALSE; } return fRet; } STDMETHODIMP SRFactory::LockServer(BOOL fLock) { return CoLockObjectExternal((LPUNKNOWN)gpSRFactory, fLock, TRUE); } //+--------------------------------------------------------------- // // Member: SRFactory:::CreateInstance // // Synopsis: Member of IClassFactory interface // //---------------------------------------------------------------- STDMETHODIMP SRFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID iid, LPVOID FAR* ppv) { #if DBG OutputDebugString(TEXT("SRFactory::CreateInstance\r\n")); #endif *ppv = NULL; //NULL output param // // create an object, then query for the appropriate interface // LPUNKNOWN pUnk; LPSRCTRL pTemp; HRESULT hr; if (OK(hr = SRCtrl::Create(pUnkOuter, _pClass, &pUnk, &pTemp))) { hr = pUnk->QueryInterface(iid, ppv); pUnk->Release(); // on failure this will release obj, otherwise // it will ensure an object ref count of 1 } return hr; } /* * for the creation of a moniker */ BOOL CreateStandaloneObject(void) { DOUT(TEXT("Soundrec CreateStandaloneObject\r\n")); // //Ensure a unique filename in gachLinkFilename so we can create valid //FileMonikers... // if(gachLinkFilename[0] == 0) BuildUniqueLinkName(); BOOL fSuccess = FALSE; LPVOID pvUnk; HRESULT hr = gpSRFactory->CreateInstance(NULL, IID_IUnknown, (LPVOID FAR*)&pvUnk); if(hr == NOERROR) { //CoLockObjectExternal((LPUNKNOWN)(LPOLEOBJECT)gpCtrlThis, TRUE, TRUE); extern LPSRCTRL gpCtrlThis; gpCtrlThis->Lock(); fSuccess = TRUE; } else { DOUT(TEXT("Soundrec CreateStandaloneObject FAILED!\r\n")); fSuccess = FALSE; } return fSuccess; }