//+------------------------------------------------------------------- // // Class: CAdvBndCF // // Synopsis: Class Factory for CAdvBnd // // Interfaces: IUnknown - QueryInterface, AddRef, Release // IClassFactory - CreateInstance // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- #include #pragma hdrstop #include const GUID CLSID_AdvBnd = {0x99999999,0x0000,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x48}}; //+------------------------------------------------------------------- // // Member: CAdvBndCF::CAdvBndCF() // // Synopsis: The constructor for CAdvBnd. // // Arguments: None // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- CAdvBndCF::CAdvBndCF() : _cRefs(1), _pCF(NULL) { return; } //+------------------------------------------------------------------- // // Member: CAdvBnd::~CAdvBndObj() // // Synopsis: The destructor for CAdvBnd. // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- CAdvBndCF::~CAdvBndCF() { if (_pCF) { _pCF->Release(); } return; } //+------------------------------------------------------------------- // // Method: CAdvBndCF::QueryInterface // // Synopsis: Only IUnknown and IClassFactory supported // //-------------------------------------------------------------------- STDMETHODIMP CAdvBndCF::QueryInterface(REFIID iid, void FAR * FAR * ppv) { if (IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IClassFactory)) { *ppv = (IUnknown *) this; AddRef(); return S_OK; } else { *ppv = NULL; return E_NOINTERFACE; } } STDMETHODIMP_(ULONG) CAdvBndCF::AddRef(void) { return ++_cRefs; } STDMETHODIMP_(ULONG) CAdvBndCF::Release(void) { if (--_cRefs == 0) { delete this; } return _cRefs; } //+------------------------------------------------------------------- // // Method: CAdvBndCF::CreateInstance // // Synopsis: This is called by Binding process to create the // actual class object // //-------------------------------------------------------------------- STDMETHODIMP CAdvBndCF::CreateInstance( IUnknown FAR* pUnkOuter, REFIID iidInterface, void FAR* FAR* ppv) { Display(TEXT("CAdvBndCF::CreateInstance called\n")); HRESULT hresult; if (!_pCF) { // Load the class object for the class to aggregate. hresult = CoGetClassObject(CLSID_BasicBnd, CLSCTX_SERVER, NULL, IID_IClassFactory, (void **) &_pCF); Win4Assert(SUCCEEDED(hresult) && "CAdvBnd::CAdvBnd CoGetClassObject failed"); if (FAILED(hresult)) { return hresult; } } if (pUnkOuter != NULL) { return E_FAIL; } CAdvBnd * lpcBB = new FAR CAdvBnd((IClassFactory *) _pCF); if (lpcBB == NULL) { return E_OUTOFMEMORY; } hresult = lpcBB->QueryInterface(iidInterface, ppv); lpcBB->Release(); return hresult; } STDMETHODIMP CAdvBndCF::LockServer(BOOL fLock) { if (fLock) GlobalRefs(TRUE); else GlobalRefs(FALSE); return S_OK; } //+------------------------------------------------------------------- // // Member: CAdvBnd::CAdvBnd() // // Synopsis: The constructor for CAdvBnd. I // // Arguments: None // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- CAdvBnd::CAdvBnd(IClassFactory *pcfBase) : _xiunk(), _dwRegister(0), _cRefs(1) { HRESULT hresult = pcfBase->CreateInstance((IUnknown *) this, IID_IUnknown, (void **) &_xiunk); GlobalRefs(TRUE); } //+------------------------------------------------------------------- // // Member: CAdvBnd::~CAdvBndObj() // // Synopsis: The destructor for CAdvBnd. // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- CAdvBnd::~CAdvBnd() { Display(TEXT("CAdvBndCF::~CAdvBnd called\n")); if (_dwRegister != 0) { // Get the running object table IRunningObjectTable *prot; HRESULT hresult = GetRunningObjectTable(0, &prot); Win4Assert(SUCCEEDED(hresult) && "CAdvBnd::~CAdvBnd GetRunningObjectTable failed"); hresult = prot->Revoke(_dwRegister); Win4Assert(SUCCEEDED(hresult) && "CAdvBnd::~CAdvBnd Revoke failed"); prot->Release(); } GlobalRefs(FALSE); } //+------------------------------------------------------------------- // // Member: CAdvBnd::QueryInterface // // Returns: SUCCESS_SUCCCESS // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- STDMETHODIMP CAdvBnd::QueryInterface(REFIID iid, void ** ppunk) { Display(TEXT("CAdvBnd::QueryInterface called\n")); if (IsEqualIID(iid, IID_IUnknown)) { *ppunk = (IUnknown *) this; AddRef(); return S_OK; } else if ((IsEqualIID(iid, IID_IPersistFile)) || (IsEqualIID(iid, IID_IPersist))) { *ppunk = (IPersistFile *) this; AddRef(); return S_OK; } return _xiunk->QueryInterface(iid, ppunk); } STDMETHODIMP_(ULONG) CAdvBnd::AddRef(void) { return ++_cRefs; } STDMETHODIMP_(ULONG) CAdvBnd::Release(void) { if (--_cRefs == 0) { delete this; } return _cRefs; } //+------------------------------------------------------------------- // // Member: CAdvBnd::Load // // Synopsis: IPeristFile interface - needed 'cause we bind with // file moniker and BindToObject insists on calling this // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- STDMETHODIMP CAdvBnd::Load(LPCOLESTR lpszFileName, DWORD grfMode) { Display(TEXT("CAdvBndCF::Load called\n")); // Forward call to delegated class IPersistFile *pipfile; HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile, (void **) &pipfile); hresult = pipfile->Load(lpszFileName, grfMode); pipfile->Release(); if (FAILED(hresult)) { // Make sure delegated too class liked what it got/ // BUGBUG: Can't just forward hresults! return hresult; } // Create a file moniker. Cast to avoid const problem. IMoniker *pmk; hresult = CreateFileMoniker((LPOLESTR)lpszFileName, &pmk); Win4Assert(SUCCEEDED(hresult) && "CAdvBnd::Load CreateFileMoniker failed"); // Get the running object table IRunningObjectTable *prot; hresult = GetRunningObjectTable(0, &prot); Win4Assert(SUCCEEDED(hresult) && "CAdvBnd::Load GetRunningObjectTable failed"); // Register in the running object table IUnknown *punk; QueryInterface(IID_IUnknown, (void **) &punk); hresult = prot->Register(0, punk, pmk, &_dwRegister); Win4Assert(SUCCEEDED(hresult) && "CAdvBnd::Load Register failed"); // Set filetime to known value FILETIME filetime; memset(&filetime, 'B', sizeof(filetime)); // Set time to some known value prot->NoteChangeTime(_dwRegister, &filetime); // Release uneeded objects pmk->Release(); prot->Release(); punk->Release(); return S_OK; } //+------------------------------------------------------------------- // // Member: CAdvBnd::Save // // Synopsis: IPeristFile interface - save // does little but here for commentry // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- STDMETHODIMP CAdvBnd::Save(LPCOLESTR lpszFileName, BOOL fRemember) { Display(TEXT("CAdvBndCF::Save called\n")); // Forward call to delegated class IPersistFile *pipfile; HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile, (void **) &pipfile); hresult = pipfile->Save(lpszFileName, fRemember); pipfile->Release(); return hresult; } //+------------------------------------------------------------------- // // Member: CAdvBnd::SaveCpmpleted // CAdvBnd::GetCurFile // CAdvBnd::IsDirty // // Synopsis: More IPeristFile interface methods // // History: 21-Nov-92 SarahJ Created // //-------------------------------------------------------------------- STDMETHODIMP CAdvBnd::SaveCompleted(LPCOLESTR lpszFileName) { Display(TEXT("CAdvBndCF::SaveCompleted called\n")); // Forward call to delegated class IPersistFile *pipfile; HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile, (void **) &pipfile); hresult = pipfile->SaveCompleted(lpszFileName); pipfile->Release(); return hresult; } STDMETHODIMP CAdvBnd::GetCurFile(LPOLESTR FAR *lpszFileName) { Display(TEXT("CAdvBndCF::GetCurFile called\n")); // Forward call to delegated class IPersistFile *pipfile; HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile, (void **) &pipfile); hresult = pipfile->GetCurFile(lpszFileName); pipfile->Release(); return hresult; } STDMETHODIMP CAdvBnd::IsDirty() { Display(TEXT("CAdvBndCF::IsDirty called\n")); // Forward call to delegated class IPersistFile *pipfile; HRESULT hresult = _xiunk->QueryInterface(IID_IPersistFile, (void **) &pipfile); hresult = pipfile->IsDirty(); pipfile->Release(); return hresult; } //+------------------------------------------------------------------- // // Interface: IPersist // // Synopsis: IPersist interface methods // Need to return a valid class id here // // History: 21-Nov-92 SarahJ Created // STDMETHODIMP CAdvBnd::GetClassID(LPCLSID classid) { Display(TEXT("CAdvBndCF::GetClassID called\n")); *classid = CLSID_AdvBnd; return S_OK; }