Dynamically load libraries during program execution.
These interfaces are used by programs that need to load libraries at run-time, that have a common interface, but different concrete behaviour. Because of this relationship between interface and behaviour, such libraries are called polymorphic DLLs.
Many parts of the system use polymorphic DLLs. Communications components, such as Sockets and Messaging, use architectures in which particular communications protocols are provided as polymorphic DLLs, and are loaded as needed. UI application programs are also polymorphic DLLs that are loaded when the user starts the program.
The API has three key concepts: polymorphic DLL, polymorphic DLL handle, and polymorphic DLL function pointer.
A program that uses a type of polymorphic DLLs defines their interface in terms of a single abstract class whose functions are declared as pure virtual. Each type of polymorphic DLL is given a unique identifier (UID).
A particular concrete DLL:
implements the interface by defining and implementing a concrete class derived from the abstract class.
exports a function that creates an object of the derived class type. All other functions in the DLL are virtual and called through the base class interface.
The polymorphic DLL handle allows a program to load and close a particular polymorphic DLL. It also allows the caller to obtain pointers to functions exported by the DLL. The system can check that a polymorphic DLL is of the correct type by checking the type UID value.
The polymorphic DLL handle interface is provided by
RLibrary
.
A wildcard file system search for polymorphic DLLs can be done
through TFindLibrary
.
An exported function is called through a pointer to function obtained through a polymorphic DLL handle.
The polymorphic DLL function pointer type is provided by the
TLibraryFunction
typedef. The caller casts the pointer to
the real type of the exported function before using it.