Newer
Older
c-interpreter / modules / libkcpp / include / kcpp_dl.hpp
////////////////////////////////////////////////////////////////////////////////
//
// KCPP Dyanmic Loader Header File
// ライブラリの動的ロードを行うモジュール
//
#ifndef KCPP_DL_HPP
#define KCPP_DL_HPP

#include <string>

#include <kcpp.hpp>
#include <kcpp_exception.hpp>


namespace kcpp
{
#if (KCPP_IS_WINDOWS)
	typedef HMODULE         dl_handle_t;
	typedef FARPROC WINAPI  dl_func_t;

#else
	typedef void*           dl_handle_t;
	typedef void*           dl_func_t;

#endif


	/**
	 * 動的ライブラリのロードエラー発生時に呼び出される例外です。
	 */
	class DynamicLoadException : public Exception
	{
		public:
			DynamicLoadException() noexcept;
			DynamicLoadException(const DynamicLoadException& t) noexcept;
			DynamicLoadException(const std::string& msg) noexcept;
			virtual ~DynamicLoadException() noexcept;
	};


	/**
	 * 動的ライブラリのローダー。
	 * 動的にライブラリをロードするクラスです。
	 *
	 * 使用例
	 *
	 * @code
	 * typedef void (*SampleFp)(void* data, size_t size);
	 * ...(省略)...
	 * DynamicLinkingLoader loader("sample.so");
	 * SampleFp dumpSample = reinterpret_cast<SampleFp>(loader.sym("dumpSample");
	 * dumpSample(data, sizeof(data));
	 */
	class DynamicLoader
	{
		public:
			DynamicLoader(const std::string& name);
			virtual ~DynamicLoader();
			dl_func_t sym(const std::string& symbol);
		private:
			DynamicLoader() noexcept = delete;
			DynamicLoader(const DynamicLoader&) = delete;
			DynamicLoader operator=(const DynamicLoader&) = delete;
			dl_handle_t handle;
	};
}

#endif	// KCPP_DL_HPP