Listing 3: Partial listing of class dll_sentinel

class dll_sentinel
   {
   public:
      dll_sentinel( std::string const& dll_name )
         : m_dll_name( dll_name )
         , m_instance( NULL )
         { init( ); }

      // copy constructor
      dll_sentinel( dll_sentinel const& source )
         : m_dll_name( source.m_dll_name )
         , m_instance( NULL )
         { init( ); }

      virtual ~dll_sentinel( )
         { reset( ); }

      void reset( )
         {
         if ( m_instance )
            {
            #ifdef _WIN32
               FreeLibrary( m_instance );
            #elif defined( _DLSYM )
               dlclose( m_instance );
            #else
               #error Unsupported Platform.   Please port me
            #endif

            m_instance = NULL;
            m_dll_name = std::string( );
            }
         } // reset( )

      // not shown: functions find_func, func_exists,
      // and is_open ...

   private: // interface
      void init( )
         {
         #ifdef _WIN32
            m_instance = LoadLibrary( m_dll_name.c_str() );
         #elif defined( _DLSYM )
            m_instance = dlopen( m_dll_name.c_str() , RTLD_NOW );
         #else
            #error Unsupported Platform.   Please port me
         #endif

         if ( !m_instance ) 
            throw dll_exception( "DLL Not Found" );
         } // init( )

   private: // data
      std::string m_dll_name;
      #ifdef _WIN32
         HMODULE m_instance;
      #elif defined( _DLSYM )
         void*    m_instance;
      #else
         #error Unsupported Platform.   Please port me
      #endif

   }; // class dll_sentinel