Mercurial > code
diff C++/modules/Dynlib/Dynlib.h @ 334:0b576ee64d45
* Create brand new hierarchy
* Rename DynLib to Dynlib
* Remove some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 08 Mar 2015 14:26:33 +0100 |
parents | C++/DynLib.h@4e17193db141 |
children | d5ec1174b707 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C++/modules/Dynlib/Dynlib.h Sun Mar 08 14:26:33 2015 +0100 @@ -0,0 +1,103 @@ +/* + * DynLib.h -- portable shared library loader + * + * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _DYNLIB_H_ +#define _DYNLIB_H_ + +#include <string> + +#if defined(_WIN32) +# include <Windows.h> +# define DYNLIB_EXPORT __declspec(dllexport) +#else +# define DYNLIB_EXPORT +#endif + +/** + * @class Dynlib + * @brief Load a dynamic module + * + * This class is a portable wrapper to load shared libraries on + * supported systems. + */ +class Dynlib { +public: +#if defined(_WIN32) + using Handle = HMODULE; + using Sym = FARPROC; +#else + using Handle = void *; + using Sym = void *; +#endif + + enum Policy { + Immediately, //! load symbols immediately + Lazy //! load symbols when needed + }; + +private: + Handle m_handle; + + void systemInit(); + Handle systemLoad(const std::string &path, Policy policy) const; + Sym systemSym(const std::string &name); + void systemClose(); + +public: + /** + * Copy is forbidden. + */ + Dynlib(const Dynlib &) = delete; + Dynlib &operator=(const Dynlib &) = delete; + + /** + * Default constructor. + */ + Dynlib(); + + /** + * Constructor to load a shared module. The path must + * be absolute. + * + * @param path the absolute path + * @param policy the policy to load + * @throw std::runtime_error on error + */ + Dynlib(const std::string &path, Policy policy = Immediately); + + /** + * Close the library automatically. + */ + ~Dynlib(); + + /** + * Get a symbol from the library. + * + * @param name the symbol + * @return the symbol + * @throw std::runtime_error on error + * @throw std::out_of_range if not found + */ + template <typename T> + T sym(const std::string &name) + { + return reinterpret_cast<T>(systemSym(name)); + } +}; + +#endif // !_DYNLIB_H_