GL Studio C++ Runtime API
dynamic_library.h
Go to the documentation of this file.
1/*! \file
2 \brief A cross-platform class for loading dynamic link libraries and shared objects.
3
4 \par Copyright Information
5
6 Copyright (c) 2017 by The DiSTI Corporation.<br>
7 11301 Corporate Blvd; Suite 100<br>
8 Orlando, Florida 32817<br>
9 USA<br>
10 <br>
11 All rights reserved.<br>
12
13 This Software contains proprietary trade secrets of DiSTI and may not be
14reproduced, in whole or part, in any form, or by any means of electronic,
15mechanical, or otherwise, without the written permission of DiSTI. Said
16permission may be derived through the purchase of applicable DiSTI product
17licenses which detail the distribution rights of this content and any
18Derivative Works based on this or other copyrighted DiSTI Software.
19
20 NO WARRANTY. THE SOFTWARE IS PROVIDED "AS-IS," WITHOUT WARRANTY OF ANY KIND,
21AND ANY USE OF THIS SOFTWARE PRODUCT IS AT YOUR OWN RISK. TO THE MAXIMUM EXTENT
22PERMITTED BY APPLICABLE LAW, DISTI AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES
23AND CONDITIONS, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
24IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND/OR FITNESS FOR A
25PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT, WITH REGARD TO THE SOFTWARE.
26
27 LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW,
28IN NO EVENT SHALL DISTI OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
29INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION,
30DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS
31INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR
32INABILITY TO USE THE SOFTWARE, EVEN IF DISTI HAS BEEN ADVISED OF THE POSSIBILITY
33OF SUCH DAMAGES. DISTI'S ENTIRE LIABILITY AND YOUR EXCLUSIVE REMEDY SHALL NOT
34EXCEED FIVE DOLLARS (US$5.00).
35
36 The aforementioned terms and restrictions are governed by the laws of the
37State of Florida and the United States of America.
38
39*/
40#ifndef _DYNAMIC_LIBRARY_H
41#define _DYNAMIC_LIBRARY_H
42
43#include "disti_include.h"
44#include <string>
45
46#if defined( _WIN32 )
47# include <windows.h>
48#endif
49
50namespace disti
51{
52typedef void* ( *FunctionPointer )( ... ); ///< Typedef for a function pointer taking variadic arguments.
53
54/** The DynamicLibrary class. A cross-platform class for loading dynamic link libraries
55* and shared objects
56*/
58{
59public:
60 /** Error Enum */
61 typedef enum
62 {
63 ERROR_NONE,
64 ERROR_VERSION_MISMATCH, ///< Load failed due to incompatible GL Studio or compiler versions
65 ERROR_UNKNOWN ///< Load failed for unknown reason (see DynamicLibrary::ErrorString())
67
68#if defined( _WIN32 )
69 typedef HMODULE LibHandle_t; ///< Windows uses a handle to the opened dynamic library.
70#else
71 typedef void* LibHandle_t; ///< Linux, macOS, and others use a pointer to the opened dynamic library.
72#endif
73
74 /**
75 * Constructor for dynamic library object. Causes the dynamic library
76 * which is passed in by filename to be opened.
77 * \param lib_name_arg A pointer to a string which is a library name to be opened, may include the path, can not be NULL
78 * \param quiet Whether this class emits error messages or fails silently.
79 * \param searchLibPath UNUSED
80 * \param tryStandardExtensions If this is true, the file extension, if any, will be stripped off and the appropriate
81 * standard extension for the current OS will be appended. If the changed filename cannot be
82 * found, then the original filename will be used as a last resort.
83 * \param matchVersion
84 */
85 DISTI_EXPORT DynamicLibrary(
86 const char* lib_name_arg,
87 bool quiet = false,
88 bool searchLibPath = false,
89 bool tryStandardExtensions = false,
90 bool matchVersion = false );
91
92 /** Destructor for dynamic library object. Closes the library so the OS can cleanup. */
93 virtual DISTI_EXPORT ~DynamicLibrary();
94
95 /**
96 * Dynamically resolves a function from the library. The name of the
97 * function is passed in.
98 * \param function_name A pointer to a string, which represents the Name of a Function to find.
99 * \return Returns a pointer to the function if it is found or NULL otherwise
100 */
101 virtual DISTI_EXPORT FunctionPointer DynamicFunction( const char* function_name );
102
103 /// \param libName The name of the library to load.
104 /// \param tryStandardExtensions If true, will try the standard extensions (i.e. .dll, .so, .dylib).
105 /// \return True if the library can be found somewhere on the system, false otherwise.
106 static DISTI_EXPORT bool Exists( const char* libName, bool tryStandardExtensions = true );
107
108 /// \param name The name of the file to locate.
109 /// \return The full path to the given file name.
110 static DISTI_EXPORT std::string Find( const std::string& name );
111
112 /// \return True if the library successfully loaded, false otherwise.
113 virtual DISTI_EXPORT bool Loaded() const;
114
115 /// Call LastError() when Loaded() is false to determine to determine
116 /// if load failure occured due to a version mismatch.
117 /// \return The error type, or ERROR_NONE if no failure.
118 DISTI_EXPORT ErrorEnum LastError() const;
119
120 /// \return The last error string or NULL if no error has occurred.
121 /// \note When tryStandardExtensions == true, this may be very long since it contains the error information for each attempted filename.
122 DISTI_EXPORT const char* ErrorString() const;
123
124 /// Removes the extension, if any, from the specified path.
125 /// \param libpath The path to be stripped of extensions.
126 static DISTI_EXPORT void RemoveExtension( std::string& libpath );
127
128private:
129 bool _quiet;
130 bool _tryStandardExtensions;
131 LibHandle_t _dlHandle;
132 ErrorEnum _lastError;
133
134 char* _errorString;
135
136 DISTI_EXPORT void SetErrorString( const char* );
137
138 /**
139 * Attempts to find the specified library file on the system.
140 * If the file doesn't exist as named, any path will be stripped off and
141 * this will try to open the library file, which uses the standard OS search
142 * algorithm to find the file. If the open is successful, the file was
143 * found.
144 *
145 * \returns true if the library is found.
146 */
147 static bool FoundOnSystem( const std::string& libname );
148
149 /**
150 * Opens the specified library searching the library paths if specified.
151 */
152 static LibHandle_t Open( const std::string& libpath, ErrorEnum& errorCode /*returned*/, bool searchLibPath = true, bool matchVersion = false, bool quiet = false );
153};
154
155} // namespace disti
156
157#endif
Definition: dynamic_library.h:58
virtual bool Loaded() const
const char * ErrorString() const
static void RemoveExtension(std::string &libpath)
DynamicLibrary(const char *lib_name_arg, bool quiet=false, bool searchLibPath=false, bool tryStandardExtensions=false, bool matchVersion=false)
void * LibHandle_t
Linux, macOS, and others use a pointer to the opened dynamic library.
Definition: dynamic_library.h:71
ErrorEnum
Definition: dynamic_library.h:62
@ ERROR_UNKNOWN
Load failed for unknown reason (see DynamicLibrary::ErrorString())
Definition: dynamic_library.h:65
@ ERROR_VERSION_MISMATCH
Load failed due to incompatible GL Studio or compiler versions.
Definition: dynamic_library.h:64
static bool Exists(const char *libName, bool tryStandardExtensions=true)
virtual FunctionPointer DynamicFunction(const char *function_name)
ErrorEnum LastError() const
static std::string Find(const std::string &name)
A file for all GL Studio files to include.
Force inclusion of the DirectShow library.
Definition: bmpimage.h:47
void *(* FunctionPointer)(...)
Typedef for a function pointer taking variadic arguments.
Definition: dynamic_library.h:52