my first outlook add-in, in c++...

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

And I'm apparently suffering from a common problem - how to get Outlook to
shutdown after my add-in is installed. I've flailed for a couple of days,
now it's time to ask for help. I've gleaned that I need to somehow close or
release or free something in the OnClose event for the Explorer, but what and
how is that done? I've tried doing
appPtr->GetApplication()->Release()...which doesn't seem to have any effect.
Here's the OnConnection() code where some of the initialization code lives,
if it helps to point out my failures...

STDMETHODIMP CConnect::OnConnection(IDispatch *pApplication,
AddInDesignerObjects::ext_ConnectMode ConnectMode, IDispatch *pAddInInst,
SAFEARRAY ** /*custom*/ )
{
pApplication->QueryInterface(__uuidof(IDispatch), (LPVOID*)&m_pApplication);

CComQIPtr <Outlook::_Application> spApp(pApplication);
ATLASSERT(spApp);
m_spApp = spApp;

CComPtr<Outlook::_Explorer> spExplorer;

spExplorer = spApp->ActiveExplorer();
m_spExplorer = spExplorer;

ExpEvents::DispEventAdvise((IDispatch*)m_spExplorer,&__uuidof(Outlook::ExplorerEvents));

AppEvents::DispEventAdvise((IDispatch*)m_spApp,&__uuidof(Outlook::ApplicationEvents));

return S_OK;
}
 
In On_Connection you first need to check if there are any Explorers at all,
Outlook can be started using automation with no UI (think ActiveSynch). You
need to maintain a count or collection of Explorers and Inspectors and
handle the Inspector.Close and Explorer.Close events. In those events if the
counts of the collections is <= 1 you know Outlook wants to close down. At
that point you need to release all objects that are being retained so the
On_Disconnection event will fire.
 
Ken Slovak - said:
In On_Connection you first need to check if there are any Explorers at all,
Outlook can be started using automation with no UI (think ActiveSynch). You
need to maintain a count or collection of Explorers and Inspectors and
handle the Inspector.Close and Explorer.Close events. In those events if the
counts of the collections is <= 1 you know Outlook wants to close down. At
that point you need to release all objects that are being retained so the
On_Disconnection event will fire.

That's one of the problems I'm looking for help on - how to "release" the
objects...
In my OnConnection I'm saving a pointer to the Application and
ActiveExplorer objects - I haven't yet figured out why my NewExplorer
callback hasn't been triggered but since in my testing I only have the one
instance of outlook running I figured that wasn't too surprising - anyway, in
my OnClose() I'm calling Release() on the application object
(m_spApp->GetApplication()->Release();) but if I try to call Release on the
explorer object (m_spExplorer->Release();), I get a 'cannot access private
member declared in class ...
error from the compiler. I got the same error from the release of the
application before I found the GetApplication() method. What's the correct
way to "release" the objects?
 
I found the problem - I created another app instance in my
OnStartupComplete, once I removed that I'm now getting the OnDisconnect.
 
Back
Top