diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp index 6cedd193abc..1dc71393809 100644 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp @@ -2,7 +2,7 @@ ** DLLoader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2017 Martin Gieseking <martin.gieseking@uos.de> ** +** Copyright (C) 2005-2018 Martin Gieseking <martin.gieseking@uos.de> ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** @@ -21,23 +21,27 @@ #ifndef DLLOADER_HPP #define DLLOADER_HPP +#include <string> + #ifdef _WIN32 - #include <windows.h> + #include "windows.hpp" #else #include <dlfcn.h> #endif -class DLLoader -{ +class DLLoader { public: - DLLoader (const char *dlname); - virtual ~DLLoader (); - bool loaded () const {return _handle != 0;} + DLLoader () =delete; + DLLoader (const std::string &dlname); + DLLoader (DLLoader &&loader) =default; + virtual ~DLLoader () {closeLibrary();} + bool loaded () const {return _handle != nullptr;} + bool loadLibrary (const std::string &dlname); protected: - DLLoader () : _handle(0) {} - void* loadSymbol (const char *name); + template <typename T> T loadSymbol (const char *name) const; + void closeLibrary (); private: #ifdef _WIN32 @@ -47,4 +51,22 @@ class DLLoader #endif }; + +/** Loads a function or variable from the dynamic/shared library. + * @param[in] name name of function/variable to load + * @return pointer to loaded symbol, or 0 if the symbol could not be loaded */ +template <typename T> +T DLLoader::loadSymbol (const char *name) const { + if (_handle) { +#ifdef _WIN32 + return reinterpret_cast<T>(GetProcAddress(_handle, name)); +#else + return reinterpret_cast<T>(dlsym(_handle, name)); +#endif + } + return nullptr; +} + +#define LOAD_SYMBOL(sym) loadSymbol<decltype(&sym)>(#sym) + #endif |