]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/dynlib.h
added interface headers with latest discussed changes
[wxWidgets.git] / interface / dynlib.h
diff --git a/interface/dynlib.h b/interface/dynlib.h
new file mode 100644 (file)
index 0000000..2553def
--- /dev/null
@@ -0,0 +1,415 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        dynlib.h
+// Purpose:     documentation for wxDynamicLibraryDetails class
+// Author:      wxWidgets team
+// RCS-ID:      $Id$
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+/**
+    @class wxDynamicLibraryDetails
+    @wxheader{dynlib.h}
+    
+    This class is used for the objects returned by 
+    wxDynamicLibrary::ListLoaded method and
+    contains the information about a single module loaded into the address space of
+    the current process. A module in this context may be either a dynamic library
+    or the main program itself.
+    
+    @library{wxbase}
+    @category{FIXME}
+*/
+class wxDynamicLibraryDetails 
+{
+public:
+    /**
+        Retrieves the load address and the size of this module.
+        
+        @param addr 
+        the pointer to the location to return load address in, may be
+        @NULL
+        
+        @param len 
+        pointer to the location to return the size of this module in
+        memory in, may be @NULL
+        
+        @returns @true if the load address and module size were retrieved, @false
+                   if this information is not available.
+    */
+    bool GetAddress(void ** addr, size_t len);
+
+    /**
+        Returns the base name of this module, e.g. @c kernel32.dll or 
+        @c libc-2.3.2.so.
+    */
+    wxString GetName();
+
+    /**
+        Returns the full path of this module if available, e.g. 
+        @c c:\windows\system32\kernel32.dll or 
+        @c /lib/libc-2.3.2.so.
+    */
+    wxString GetPath();
+
+    /**
+        Returns the version of this module, e.g. @c 5.2.3790.0 or 
+        @c 2.3.2. The returned string is empty if the version information is not
+        available.
+    */
+    wxString GetVersion();
+};
+
+
+/**
+    @class wxDllLoader
+    @wxheader{dynlib.h}
+    
+    @b Deprecation note: This class is deprecated since version 2.4 and is
+    not compiled in by default in version 2.6 and will be removed in 2.8. Please
+    use wxDynamicLibrary instead.
+    
+    wxDllLoader is a class providing an interface similar to Unix's @c dlopen(). It
+    is used by the wxLibrary framework and manages the actual
+    loading of shared libraries and the resolving of symbols in them. There are no
+    instances of this class, it simply serves as a namespace for its static member
+    functions.
+    
+    Please note that class wxDynamicLibrary provides 
+    alternative, friendlier interface to wxDllLoader.
+    
+    The terms @e DLL and @e shared library/object will both be used in the
+    documentation to refer to the same thing: a @c .dll file under Windows or 
+    @c .so or @c .sl one under Unix.
+    
+    Example of using this class to dynamically load the @c strlen() function:
+    
+    @code
+    #if defined(__WXMSW__)
+        static const wxChar *LIB_NAME = _T("kernel32");
+        static const wxChar *FUNC_NAME = _T("lstrlenA");
+    #elif defined(__UNIX__)
+        static const wxChar *LIB_NAME = _T("/lib/libc-2.0.7.so");
+        static const wxChar *FUNC_NAME = _T("strlen");
+    #endif
+    
+        wxDllType dllHandle = wxDllLoader::LoadLibrary(LIB_NAME);
+        if ( !dllHandle )
+        {
+            ... error ...
+        }
+        else
+        {
+            typedef int (*strlenType)(char *);
+            strlenType pfnStrlen = (strlenType)wxDllLoader::GetSymbol(dllHandle,
+    FUNC_NAME);
+            if ( !pfnStrlen )
+            {
+                ... error ...
+            }
+            else
+            {
+                if ( pfnStrlen("foo") != 3 )
+                {
+                    ... error ...
+                }
+                else
+                {
+                    ... ok! ...
+                }
+            }
+    
+            wxDllLoader::UnloadLibrary(dllHandle);
+        }
+    @endcode
+    
+    @library{wxbase}
+    @category{appmanagement}
+*/
+class wxDllLoader 
+{
+public:
+    /**
+        Returns the string containing the usual extension for shared libraries for the
+        given systems (including the leading dot if not empty).
+        
+        For example, this function will return @c ".dll" under Windows or (usually) 
+        @c ".so" under Unix.
+    */
+    static wxString GetDllExt();
+
+    /**
+        This function returns a valid handle for the main program itself. Notice that
+        the @NULL return value is valid for some systems (i.e. doesn't mean that
+        the function failed).
+        
+        @b NB: This function is Unix specific. It will always fail under Windows
+        or OS/2.
+    */
+    wxDllType GetProgramHandle();
+
+    /**
+        This function resolves a symbol in a loaded DLL, such as a variable or
+        function name.
+        
+        Returned value will be @NULL if the symbol was not found in the DLL or if
+        an error occurred.
+        
+        @param dllHandle 
+        Valid handle previously returned by 
+        LoadLibrary
+        
+        @param name 
+        Name of the symbol.
+    */
+    void * GetSymbol(wxDllType dllHandle, const wxString& name);
+
+    /**
+        This function loads a shared library into memory, with @e libname being the
+        name of the library: it may be either the full name including path and
+        (platform-dependent) extension, just the basename (no path and no extension)
+        or a basename with extension. In the last two cases, the library will be
+        searched in all standard locations.
+        
+        Returns a handle to the loaded DLL. Use @e success parameter to test if it
+        is valid. If the handle is valid, the library must be unloaded later with 
+        UnloadLibrary().
+        
+        @param libname 
+        Name of the shared object to load.
+        
+        @param success 
+        May point to a bool variable which will be set to @true or
+        @false; may also be @NULL.
+    */
+    wxDllType LoadLibrary(const wxString & libname,
+                          bool* success = @NULL);
+
+    /**
+        This function unloads the shared library. The handle @e dllhandle must have
+        been returned by LoadLibrary() previously.
+    */
+    void UnloadLibrary(wxDllType dllhandle);
+};
+
+
+/**
+    @class wxDynamicLibrary
+    @wxheader{dynlib.h}
+    
+    wxDynamicLibrary is a class representing dynamically loadable library
+    (Windows DLL, shared library under Unix etc.). Just create an object of
+    this class to load a library and don't worry about unloading it -- it will be
+    done in the objects destructor automatically.
+    
+    @library{wxbase}
+    @category{FIXME}
+    
+    @seealso
+    wxDynamicLibrary::CanonicalizePluginName
+*/
+class wxDynamicLibrary 
+{
+public:
+    //@{
+    /**
+        Constructor. Second form calls Load().
+    */
+    wxDynamicLibrary();
+        wxDynamicLibrary(const wxString& name,
+                         int flags = wxDL_DEFAULT);
+    //@}
+
+    /**
+        Returns the platform-specific full name for the library called @e name. E.g.
+        it adds a @c ".dll" extension under Windows and @c "lib" prefix and 
+        @c ".so", @c ".sl" or maybe @c ".dylib" extension under Unix.
+        
+        The possible values for @e cat are:
+        
+            
+        
+        wxDL_LIBRARY
+        
+        
+        normal library
+        
+            
+        
+        wxDL_MODULE
+        
+        
+        a loadable module or plugin
+        
+        
+        @sa CanonicalizePluginName()
+    */
+    static wxString CanonicalizeName(const wxString& name,
+                                     wxDynamicLibraryCategory cat = wxDL_LIBRARY);
+
+    /**
+        This function does the same thing as 
+        CanonicalizeName() but for wxWidgets
+        plugins. The only difference is that compiler and version information are added
+        to the name to ensure that the plugin which is going to be loaded will be
+        compatible with the main program.
+        
+        The possible values for @e cat are:
+        
+            
+        
+        wxDL_PLUGIN_GUI
+        
+        
+        plugin which uses GUI classes (default)
+        
+            
+        
+        wxDL_PLUGIN_BASE
+        
+        
+        plugin which only uses wxBase
+    */
+    static wxString CanonicalizePluginName(const wxString& name,
+                                           wxPluginCategory cat = wxDL_PLUGIN_GUI);
+
+    /**
+        Detaches this object from its library handle, i.e. the object will not unload
+        the library any longer in its destructor but it is now the callers
+        responsibility to do this using Unload().
+    */
+    wxDllType Detach();
+
+    /**
+        Return a valid handle for the main program itself or @NULL if symbols
+        from the main program can't be loaded on this platform.
+    */
+    static wxDllType GetProgramHandle();
+
+    /**
+        Returns pointer to symbol @e name in the library or @NULL if the library
+        contains no such symbol.
+        
+        @sa wxDYNLIB_FUNCTION
+    */
+    void * GetSymbol(const wxString& name);
+
+    /**
+        This function is available only under Windows as it is only useful when
+        dynamically loading symbols from standard Windows DLLs. Such functions have
+        either @c 'A' (in ANSI build) or @c 'W' (in Unicode, or wide
+        character build) suffix if they take string parameters. Using this function you
+        can use just the base name of the function and the correct suffix is appende
+        automatically depending on the current build. Otherwise, this method is
+        identical to GetSymbol().
+    */
+    void * GetSymbolAorW(const wxString& name);
+
+    /**
+        Returns @true if the symbol with the given @e name is present in the dynamic
+        library, @false otherwise. Unlike GetSymbol(),
+        this function doesn't log an error message if the symbol is not found.
+        
+        This function is new since wxWidgets version 2.5.4
+    */
+    bool HasSymbol(const wxString& name);
+
+    /**
+        Returns @true if the library was successfully loaded, @false otherwise.
+    */
+    bool IsLoaded();
+
+    /**
+        This static method returns an array containing the details
+        of all modules loaded into the address space of the current project, the array
+        elements are object of @c wxDynamicLibraryDetails class. The array will
+        be empty if an error occurred.
+        
+        This method is currently implemented only under Win32 and Linux and is useful
+        mostly for diagnostics purposes.
+    */
+    static wxDynamicLibraryDetailsArray ListLoaded();
+
+    /**
+        Loads DLL with the given @e name into memory. The @e flags argument can
+        be a combination of the following bits:
+        
+        wxDL_LAZY
+        
+        
+        equivalent of RTLD_LAZY under Unix, ignored elsewhere
+        
+        wxDL_NOW
+        
+        
+        equivalent of RTLD_NOW under Unix, ignored elsewhere
+        
+        wxDL_GLOBAL
+        
+        
+        equivalent of RTLD_GLOBAL under Unix, ignored elsewhere
+        
+        wxDL_VERBATIM
+        
+        
+        don't try to append the appropriate extension to
+        the library name (this is done by default).
+        
+        wxDL_DEFAULT
+        
+        
+        default flags, same as wxDL_NOW currently
+        
+        wxDL_QUIET
+        
+        
+        don't log an error message if the library couldn't be
+        loaded.
+        
+        Returns @true if the library was successfully loaded, @false otherwise.
+    */
+    bool Load(const wxString& name, int flags = wxDL_DEFAULT);
+
+    //@{
+    /**
+        Unloads the library from memory. wxDynamicLibrary object automatically calls
+        this method from its destructor if it had been successfully loaded.
+        
+        The second version is only used if you need to keep the library in memory
+        during a longer period of time than the scope of the wxDynamicLibrary object.
+        In this case you may call Detach() and store
+        the handle somewhere and call this static method later to unload it.
+    */
+    void Unload();
+        static void Unload(wxDllType handle);
+    //@}
+};
+
+
+// ============================================================================
+// Global functions/macros
+// ============================================================================
+
+/**
+    When loading a function from a DLL you always have to cast the returned
+    @c void * pointer to the correct type and, even more annoyingly, you have to
+    repeat this type twice if you want to declare and define a function pointer all
+    in one line
+    
+    This macro makes this slightly less painful by allowing you to specify the
+    type only once, as the first parameter, and creating a variable of this type
+    named after the function but with @c pfn prefix and initialized with the
+    function @e name from the wxDynamicLibrary
+    @e dynlib.
+    
+    @param type 
+    the type of the function
+    
+    @param name 
+    the name of the function to load, not a string (without quotes,
+    it is quoted automatically by the macro)
+    
+    @param dynlib 
+    the library to load the function from
+*/
+#define wxDYNLIB_FUNCTION(type,  name,  dynlib)     /* implementation is private */
+