void COleDispatchDriver::AttachDispatch(LPDISPATCH lpDispatch, BOOL bAutoRelease) { ASSERT(lpDispatch != NULL); ReleaseDispatch(); // detach previous m_lpDispatch = lpDispatch; m_bAutoRelease = bAutoRelease; }
CSaxModule& CSaxModule::operator=(const CSaxModule& module) { if (this != &module) { if (module.m_lpDispatch == NULL) ReleaseDispatch(); else { module.m_lpDispatch->AddRef(); AttachDispatch(module.m_lpDispatch); } } return *this; }
CSaxHandlers& CSaxHandlers::operator=(const CSaxHandlers& handlers) { if (this != &handlers) { if (handlers.m_lpDispatch == NULL) ReleaseDispatch(); else { handlers.m_lpDispatch->AddRef(); AttachDispatch(handlers.m_lpDispatch); } } return *this; }
BOOL CXLAutomation::ReleaseExcel() { if (m_pdispExcelApp == NULL) return TRUE; // Tell Excel to quit, since for automation simply releasing the IDispatch // object isn't enough to get the server to shut down. // Note that this code will hang if Excel tries to display any message boxes. // This can occur if a document is in need of saving. The CreateChart() code // always clears the dirty bit on the documents it creates, avoiding this problem. ClearAllArgs(); ExlInvoke(m_pdispExcelApp, L"Quit", NULL, DISPATCH_METHOD, 0); // Even though Excel has been told to Quit, we still need to release the // OLE object to account for all memory. ReleaseDispatch(); return TRUE; }
CXLAutomation::~CXLAutomation() { //ReleaseExcel(); ReleaseDispatch(); OleUninitialize(); }