ACE_DLL Class Reference

Provides an abstract interface for handling various DLL operations. More...

#include <DLL.h>

Collaboration diagram for ACE_DLL:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 ACE_DLL (int close_handle_on_destruction=1)
const ACE_DLLoperator= (const ACE_DLL &rhs)
 Allow assignment.

 ACE_DLL (const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_handle_on_destruction=1)
 ACE_DLL (const ACE_DLL &)
 Copy constructor.

int open (const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_handle_on_destruction=1)
int close (void)
 Call to close the DLL object.

 ~ACE_DLL (void)
void * symbol (const ACE_TCHAR *symbol_name, int ignore_errors=0)
ACE_TCHARerror (void) const
ACE_SHLIB_HANDLE get_handle (int become_owner=0) const
int set_handle (ACE_SHLIB_HANDLE handle, int close_handle_on_destruction=1)
 Set the handle for the DLL object. By default, the close().


Public Attributes

int open_mode_
 Open mode.

ACE_TCHARdll_name_
int close_handle_on_destruction_
ACE_DLL_Handledll_handle_
int error_
 Flag to record if the last operation had an error.


Private Member Functions

int open_i (const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_handle_on_destruction=1, ACE_SHLIB_HANDLE handle=0)

Detailed Description

Provides an abstract interface for handling various DLL operations.

This class is a wrapper over the various methods for utilizing a dynamically linked library (DLL), which is called a shared library on some platforms. Operations open(), close(), and symbol() have been implemented to help opening/closing and extracting symbol information from a DLL, respectively.

Definition at line 42 of file DLL.h.


Constructor & Destructor Documentation

ACE_BEGIN_VERSIONED_NAMESPACE_DECL ACE_DLL::ACE_DLL int  close_handle_on_destruction = 1  )  [explicit]
 

Default constructor. By default, the close() operation on the object will be invoked before it is destroyed.

Parameters:
close_handle_on_destruction Indicates whether or not the close() method will be called to close an open DLL when this object is destroyed. By default, close() will be called. Set this parameter to 0 for situations where the DLL's lifetime is controlled in a scope other than that of this ACE_DLL object. For example, termination by ACE_DLL_Manager via ACE::fini().

Definition at line 19 of file DLL.cpp.

References ACE_TRACE.

00020   : open_mode_ (0),
00021     dll_name_ (0),
00022     close_handle_on_destruction_ (close_handle_on_destruction),
00023     dll_handle_ (0),
00024     error_ (0)
00025 {
00026   ACE_TRACE ("ACE_DLL::ACE_DLL (int)");
00027 }

ACE_DLL::ACE_DLL const ACE_TCHAR dll_name,
int  open_mode = ACE_DEFAULT_SHLIB_MODE,
int  close_handle_on_destruction = 1
[explicit]
 

This constructor performs the actions of open() during construction.

Parameters:
dll_name The name or path of the DLL to load.
open_mode Flags to alter the actions taken when loading the DLL. The possible values are:
  • RTLD_LAZY (this the default): loads identifier symbols but not the symbols for functions, which are loaded dynamically on-demand.
  • RTLD_NOW: performs all necessary relocations when dll_name is first loaded
  • RTLD_GLOBAL: makes symbols available for relocation processing of any other DLLs.
close_handle_on_destruction Indicates whether or not the close() method will be called to close an open DLL when this object is destroyed. By default, close() will be called. Set this parameter to 0 for situations where the DLL's lifetime is controlled in a scope other than that of this ACE_DLL object. For example, termination by ACE_DLL_Manager via ACE::fini().

Definition at line 79 of file DLL.cpp.

References ACE_ERROR, ACE_LIB_TEXT, ACE_TCHAR, ACE_TRACE, ACE::debug(), LM_ERROR, and open().

00082   : open_mode_ (open_mode),
00083     dll_name_ (0),
00084     close_handle_on_destruction_ (close_handle_on_destruction),
00085     dll_handle_ (0),
00086     error_ (0)
00087 {
00088   ACE_TRACE ("ACE_DLL::ACE_DLL");
00089 
00090   if (this->open (dll_name, this->open_mode_, close_handle_on_destruction) != 0
00091       && ACE::debug ())
00092     ACE_ERROR ((LM_ERROR,
00093                 ACE_LIB_TEXT ("ACE_DLL::open: error calling open: %s\n"),
00094                 this->error ()));
00095 }

ACE_DLL::ACE_DLL const ACE_DLL  ) 
 

Copy constructor.

Definition at line 29 of file DLL.cpp.

References ACE_ERROR, ACE_LIB_TEXT, ACE_TRACE, close_handle_on_destruction_, ACE::debug(), dll_name_, LM_ERROR, open(), and open_mode_.

00030   : open_mode_ (0),
00031     dll_name_ (0),
00032     close_handle_on_destruction_ (0),
00033     dll_handle_ (0),
00034     error_ (0)
00035 {
00036   ACE_TRACE ("ACE_DLL::ACE_DLL (const ACE_DLL &)");
00037 
00038   if (rhs.dll_name_
00039       // This will automatically up the refcount.
00040       && this->open (rhs.dll_name_,
00041                      rhs.open_mode_,
00042                      rhs.close_handle_on_destruction_) != 0
00043       && ACE::debug ())
00044     ACE_ERROR ((LM_ERROR,
00045     ACE_LIB_TEXT ("ACE_DLL::copy_ctor: error: %s\n"),
00046     this->error ()));
00047 }

ACE_DLL::~ACE_DLL void   ) 
 

Called when the DLL object is destroyed -- invokes close() if the close_handle_on_destruction flag was set to non-zero in the constructor or open() method.

Definition at line 101 of file DLL.cpp.

References ACE_TRACE, close(), and dll_name_.

00102 {
00103   ACE_TRACE ("ACE_DLL::~ACE_DLL");
00104 
00105   this->close ();
00106 
00107   // Normally delete()d in ACE_DLL::close().  However, that may not
00108   // occur if full ACE_DLL initialization is interrupted due to errors
00109   // (e.g. attempting to open a DSO/DLL that does not exist).  Make
00110   // sure this->dll_name_ is deallocated.
00111   delete [] this->dll_name_;
00112 }


Member Function Documentation

int ACE_DLL::close void   ) 
 

Call to close the DLL object.

Definition at line 203 of file DLL.cpp.

References ACE_TRACE, ACE_DLL_Manager::close_dll(), close_handle_on_destruction_, dll_handle_, dll_name_, error_, and ACE_DLL_Manager::instance().

Referenced by open_i(), and ~ACE_DLL().

00204 {
00205   ACE_TRACE ("ACE_DLL::close");
00206 
00207   int retval = 0;
00208 
00209   if (this->dll_handle_
00210       && this->close_handle_on_destruction_
00211       && this->dll_name_
00212       && (retval = ACE_DLL_Manager::instance ()->close_dll (this->dll_name_)) != 0)
00213     this->error_ = 1;
00214 
00215   // Even if close_dll() failed, go ahead and cleanup.
00216   this->dll_handle_ = 0;
00217   delete [] this->dll_name_;
00218   this->dll_name_ = 0;
00219   this->close_handle_on_destruction_ = 0;
00220 
00221   return retval;
00222 }

ACE_TCHAR * ACE_DLL::error void   )  const
 

Returns a pointer to a string explaining that an error occured. You will need to consult the error log for the actual error string returned by the OS.

Definition at line 227 of file DLL.cpp.

References ACE_LIB_TEXT, ACE_TRACE, and error_.

Referenced by ACE_Location_Node::open_dll(), ACE_Function_Node::symbol(), and ACE_Object_Node::symbol().

00228 {
00229   ACE_TRACE ("ACE_DLL::error");
00230   if (this->error_)
00231     return
00232       const_cast<ACE_TCHAR *> (ACE_LIB_TEXT ("Error: check log for details."));
00233 
00234   return 0;
00235 }

ACE_SHLIB_HANDLE ACE_DLL::get_handle int  become_owner = 0  )  const
 

Return the handle to the caller. If become_owner is non-0 then caller assumes ownership of the handle and the ACE_DLL object won't call close() when it goes out of scope, even if is set.

Definition at line 242 of file DLL.cpp.

References ACE_SHLIB_HANDLE, ACE_SHLIB_INVALID_HANDLE, ACE_TRACE, dll_handle_, and ACE_DLL_Handle::get_handle().

00243 {
00244   ACE_TRACE ("ACE_DLL::get_handle");
00245 
00246   ACE_SHLIB_HANDLE handle = ACE_SHLIB_INVALID_HANDLE;
00247 
00248   if (this->dll_handle_)
00249     handle = this->dll_handle_->get_handle (become_owner);
00250 
00251   return handle;
00252 }

int ACE_DLL::open const ACE_TCHAR dll_name,
int  open_mode = ACE_DEFAULT_SHLIB_MODE,
int  close_handle_on_destruction = 1
 

This method opens and dynamically links a specified DLL.

Parameters:
dll_name The filename or path of the DLL to load. If a filename is given to open(), the ACE::ldfind() is used to locate DLLs via the following algorithms: (1) DLL filename expansion: ACE::ldfind() determines the name of the DLL by adding the appropriate prefix and suffix, e.g., it adds the lib prefix and .so suffix for Solaris and the .dll suffix for Windows and (2) DLL search path: ACE::ldfind() will also search for the designated DLL using the platform's DLL search path environment variable, e.g., it searches for DLLs using LD_LIBRARY_PATH on many UNIX systems and PATH on Windows.
open_mode Flags to alter the actions taken when loading the DLL. The possible values are:
  • RTLD_LAZY (this the default): loads identifier symbols but not the symbols for functions, which are loaded dynamically on-demand.
  • RTLD_NOW: performs all necessary relocations when dll_name is first loaded
  • RTLD_GLOBAL: makes symbols available for relocation processing of any other DLLs.
close_handle_on_destruction Indicates whether or not the close() method will be called to close an open DLL when this object is destroyed. By default, close() will be called. Set this parameter to 0 for situations where the DLL's lifetime is controlled in a scope other than that of this ACE_DLL object. For example, termination by ACE_DLL_Manager via ACE::fini().
Return values:
-1 On failure
0 On success.

Definition at line 126 of file DLL.cpp.

References ACE_TCHAR, ACE_TRACE, and open_i().

Referenced by ACE_DLL(), ACE_Location_Node::open_dll(), and operator=().

00129 {
00130   ACE_TRACE ("ACE_DLL::open");
00131 
00132   return open_i (dll_filename, open_mode, close_handle_on_destruction);
00133 }

int ACE_DLL::open_i const ACE_TCHAR dll_name,
int  open_mode = ACE_DEFAULT_SHLIB_MODE,
int  close_handle_on_destruction = 1,
ACE_SHLIB_HANDLE  handle = 0
[private]
 

Definition at line 136 of file DLL.cpp.

References ACE_ERROR, ACE_LIB_TEXT, ACE_SHLIB_HANDLE, ACE_TCHAR, ACE_TRACE, close(), close_handle_on_destruction_, ACE::debug(), dll_handle_, dll_name_, error_, ACE_DLL_Manager::instance(), LM_ERROR, ACE_DLL_Manager::open_dll(), open_mode_, ACE_OS::strcmp(), and ACE::strnew().

Referenced by open(), and set_handle().

00140 {
00141   ACE_TRACE ("ACE_DLL::open_i");
00142 
00143   this->error_ = 0;
00144 
00145   if (!dll_filename)
00146     {
00147       if (ACE::debug ())
00148         ACE_ERROR ((LM_ERROR,
00149                     ACE_LIB_TEXT ("ACE_DLL::open_i: dll_name is %s\n"),
00150                     this->dll_name_ == 0 ? ACE_LIB_TEXT ("(null)")
00151         : this->dll_name_));
00152       return -1;
00153     }
00154 
00155   if (this->dll_handle_)
00156     {
00157       // If we have a good handle and its the same name, just return.
00158       if (ACE_OS::strcmp (this->dll_name_, dll_filename) == 0)
00159         return 0;
00160       else
00161         this->close ();
00162     }
00163 
00164   if (!this->dll_name_)
00165     this->dll_name_ = ACE::strnew (dll_filename);
00166 
00167   this->open_mode_ = open_mode;
00168   this->close_handle_on_destruction_ = close_handle_on_destruction;
00169 
00170   this->dll_handle_ = ACE_DLL_Manager::instance()->open_dll (this->dll_name_,
00171                                                              this->open_mode_,
00172                                                              handle);
00173 
00174   if (!this->dll_handle_)
00175     this->error_ = 1;
00176 
00177   return this->error_ ? -1 : 0;
00178 }

const ACE_DLL & ACE_DLL::operator= const ACE_DLL rhs  ) 
 

Allow assignment.

Definition at line 52 of file DLL.cpp.

References ACE_ERROR, ACE_LIB_TEXT, ACE_TRACE, close_handle_on_destruction_, ACE::debug(), dll_handle_, dll_name_, error_, LM_ERROR, open(), and open_mode_.

00053 {
00054   ACE_TRACE ("ACE_DLL::operator= (const ACE_DLL &)");
00055 
00056   open_mode_ = 0;
00057   dll_name_ = 0;
00058   close_handle_on_destruction_=0;
00059   dll_handle_=0;
00060   error_=0;
00061 
00062   if (rhs.dll_name_
00063       // This will automatically up the refcount and initialize *this
00064       && this->open (rhs.dll_name_,
00065                      rhs.open_mode_,
00066                      rhs.close_handle_on_destruction_) != 0
00067       && ACE::debug ())
00068     ACE_ERROR ((LM_ERROR,
00069     ACE_LIB_TEXT ("ACE_DLL::operator=: error: %s\n"),
00070     this->error ()));
00071 
00072   return *this;
00073 }

int ACE_DLL::set_handle ACE_SHLIB_HANDLE  handle,
int  close_handle_on_destruction = 1
 

Set the handle for the DLL object. By default, the close().

Definition at line 258 of file DLL.cpp.

References ACE_SHLIB_HANDLE, ACE_TCHAR, ACE_TRACE, ACE_UNIQUE_NAME_LEN, open_i(), and ACE_OS::unique_name().

Referenced by ACE_Service_Type::ACE_Service_Type().

00260 {
00261   ACE_TRACE ("ACE_DLL::set_handle");
00262 
00263   // Create a unique name.  Note that this name is only quaranteed
00264   // to be unique for the life of this object.
00265   ACE_TCHAR temp[ACE_UNIQUE_NAME_LEN];
00266   ACE_OS::unique_name (this, temp, ACE_UNIQUE_NAME_LEN);
00267 
00268   return this->open_i (temp, 1, close_handle_on_destruction, handle);
00269 }

void * ACE_DLL::symbol const ACE_TCHAR symbol_name,
int  ignore_errors = 0
 

Look up a named symbol in the DLL. DLL must be successfully opened before calling symbol().

Parameters:
symbol_name The symbol name to look up.
ignore_errors If set to 1, allows you to probe a dll without generating error messages in the log. Handy for determining the capabilities of a library.
Returns:
Returns the value of symbol_name if it is a valid symbol in the DLL. Otherwise, returns 0.

Definition at line 183 of file DLL.cpp.

References ACE_TCHAR, ACE_TRACE, dll_handle_, error_, and ACE_DLL_Handle::symbol().

Referenced by ACE_Function_Node::symbol(), and ACE_Object_Node::symbol().

00184 {
00185   ACE_TRACE ("ACE_DLL::symbol");
00186 
00187   this->error_ = 0;
00188 
00189   void *sym = 0;
00190   if (this->dll_handle_)
00191     sym = this->dll_handle_->symbol (sym_name, ignore_errors);
00192 
00193   if (!sym)
00194     this->error_ = 1;
00195 
00196   return sym;
00197 }


Member Data Documentation

int ACE_DLL::close_handle_on_destruction_
 

This flag keeps track of whether we should close the handle automatically when the object is destroyed.

Definition at line 184 of file DLL.h.

Referenced by ACE_DLL(), close(), open_i(), and operator=().

ACE_DLL_Handle* ACE_DLL::dll_handle_
 

Definition at line 186 of file DLL.h.

Referenced by close(), get_handle(), open_i(), operator=(), and symbol().

ACE_TCHAR* ACE_DLL::dll_name_
 

Keep track of the name of the loaded dll, so it can be used to remove framework components, singletons that live in the dll, prior to unloading the dll in the close() method.

Definition at line 180 of file DLL.h.

Referenced by ACE_DLL(), close(), open_i(), operator=(), and ~ACE_DLL().

int ACE_DLL::error_
 

Flag to record if the last operation had an error.

Definition at line 189 of file DLL.h.

Referenced by close(), error(), open_i(), operator=(), and symbol().

int ACE_DLL::open_mode_
 

Open mode.

Definition at line 175 of file DLL.h.

Referenced by ACE_DLL(), open_i(), and operator=().


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 11:21:37 2006 for ACE by doxygen 1.3.6