An add-in will often need to contain data that has application-level scope. For example, an add-in might have a connection to a database that is only open as long as the add-in is in use.
Or it might keep a cache of the results of long slow calculations, so that if the same calculation is required more than once, the answer will be cost-free after the first call. (See Results cache for a built-in utility that will do this for you.)
XLL+ projects include a single instance of a class descended from CXllApp. This class and all its code is generated initially by the AppWizard when the project is created.
The CXllApp object represents the add-in library. It is in existence for as long as the library is open, and its lifetime ends when the add-in is closed.
It is a convenient place to keep data and objects that must exist at application scope.
You can get a pointer to your CXllApp instance at any time by calling the static method CXllApp::Instance() or the global functions XllGetApp() and XllGetTypedApp().
CXllApp has a number of events which you can trap by implementing virtual functions. The table below lists the most important events.
| Event | Description |
|---|---|
| OnXllOpenEx | Called by the framework when Excel opens the XLL. The overridden function can return FALSE to halt further loading of the XLL. |
| OnXllClose | Called by the framework when Excel closes the XLL |
You should perform any initialization for your global objects in
OnXllOpenEx(), and return FALSE if it fails.
Similarly, any termination code should be in OnXllClose().
The application class is declared in the main header file for the
project, e.g. tutorial1.h.
You can add your own data by declaring it as a member variable of the class:
CopyC++class CTutorial1App : public CXllApp { public: CTutorial1App(); // Names public: static LPCTSTR m_pszDefName; // Data MyGlobalObject m_thingummy; // Overrides virtual BOOL OnXllOpenEx(); virtual void OnXllClose(); ... };
On the other hand, it may not be convenient to keep the global instance of your object inside the application class, particularly if the same object is used in multiple add-ins, or if the code is provided by a 3rd party.
In this case you can still hook your object up to the XllOpen and XllClose events. See Open & Close events for a discussion of this technique.