// Copyright 2014 Renato Tegon Forti, Antony Polukhin. // Copyright 2015 Antony Polukhin. // // 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) //[plugcpp_my_plugin_refcounting_api #include "../tutorial_common/my_plugin_api.hpp" #include class my_refcounting_api: public my_plugin_api { public: // Returns path to shared object that holds a plugin. // Must be instantiated in plugin. virtual boost::filesystem::path location() const = 0; }; //] //[plugcpp_library_holding_deleter_api_bind #include #include #include struct library_holding_deleter { boost::shared_ptr lib_; void operator()(my_refcounting_api* p) const { delete p; } }; inline boost::shared_ptr bind(my_refcounting_api* plugin) { // getting location of the shared library that holds the plugin boost::filesystem::path location = plugin->location(); // `make_shared` is an efficient way to create a shared pointer boost::shared_ptr lib = boost::make_shared(location); library_holding_deleter deleter; deleter.lib_ = lib; return boost::shared_ptr( plugin, deleter ); } //] //[plugcpp_get_plugin_refcounting #include #include inline boost::shared_ptr get_plugin( boost::filesystem::path path, const char* func_name) { typedef my_refcounting_api*(func_t)(); boost::function creator = boost::dll::import_alias( path, func_name, boost::dll::load_mode::append_decorations // will be ignored for executable ); // `plugin` does not hold a reference to shared library. If `creator` will go out of scope, // then `plugin` can not be used. my_refcounting_api* plugin = creator(); // Returned variable holds a reference to // shared_library and it is safe to use it. return bind( plugin ); // `creator` goes out of scope here and will be destroyed. } //]