/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2010-2011 Artyom Beilis (Tonkikh) // // Distributed under: // // the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // or (at your opinion) under: // // The MIT License // (See accompanying file MIT.txt or a copy at // http://www.opensource.org/licenses/mit-license.php) // /////////////////////////////////////////////////////////////////////////////// #define CPPDB_SOURCE #include #include #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) # include # define RTLD_LAZY 0 namespace cppdb { namespace { void *dlopen(char const *name,int /*unused*/) { return LoadLibrary(name); } void dlclose(void *h) { HMODULE m=(HMODULE)(h); FreeLibrary(m); } void *dlsym(void *h,char const *sym) { HMODULE m=(HMODULE)(h); return (void *)GetProcAddress(m,sym); } } } #else # include #endif namespace cppdb { shared_object::shared_object(std::string name,void *h) : dlname_(name), handle_(h) { } shared_object::~shared_object() { dlclose(handle_); } ref_ptr shared_object::open(std::string const &name) { ref_ptr dl; void *h=dlopen(name.c_str(),RTLD_LAZY); if(!h) { return dl; } try { dl.reset(new shared_object(name,h)); h=0; return dl; } catch(...) { if(h) { dlclose(h); } throw; } } void *shared_object::sym(std::string const &s) { return dlsym(handle_,s.c_str()); } void *shared_object::safe_sym(std::string const &s) { void *p=sym(s); if(!p) { throw cppdb_error("cppdb::shared_object::failed to resolve symbol [" + s +"] in " + dlname_); } return p; } } // cppdb