The short answer is "no, you have no way of knowing when the browser is going away."
The long answer is as follows:
- In IE6 and IE7 you can have BHOs in each tab, and maintain a global, process-wide count of open tabs by atomically incrementing a count when each BHO gets constructed, and atomically decrementing the count when you get a DWebBrowserEvents2::OnQuit message. Then, when the count gets to one, and you get an OnQuit message, you know you're the last tab and the process is going away.
- In IE8 you're out of luck because it does the process separation thing, and even then you could try to rig something up, but tab host processes don't go away when all their tabs are closed. They stick around for awhile in case a new tab opens.
But none of this really matters, since you just want to cleanup when your control is destroyed, which is when the page navigates. I'm not sure what you mean by "[the control] is used between pages", since that really isn't supported.
The proper way to know your control is going away is to implement IOleObject and IE will call IOleObject::SetClientSite(NULL) when it is time for you to go away. When you get the NULL site, you cleanup.