diff options
Diffstat (limited to 'src/lua-plugin.cc')
-rw-r--r-- | src/lua-plugin.cc | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/lua-plugin.cc b/src/lua-plugin.cc new file mode 100644 index 0000000..79968a6 --- /dev/null +++ b/src/lua-plugin.cc @@ -0,0 +1,43 @@ +#include <lua-plugin.h> + +typedef void(*init_ptr_t)(Lua *); + +#ifdef _WIN32 +#include <windows.h> + +void LuaLoadPlugin(const String & _fname, Lua * L) throw (GeneralException) { + HMODULE handle; + String fname = _fname + ".dll"; + + if (!(handle = LoadLibraryEx(fname.to_charp(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH)) && + !(handle = LoadLibraryEx(fname.to_charp(), NULL, NULL))) { + throw GeneralException("File not found or error loading shared object file: " + fname + "; Error #" + String((int) GetLastError())); + } + + init_ptr_t init_ptr = (init_ptr_t) GetProcAddress(handle, "init_plugin"); + + if (!init_ptr) { + throw GeneralException("No init pointer on plugin " + fname); + } + + init_ptr(L); +} +#else +#include <dlfcn.h> + +void LuaLoadPlugin(const String & fname, Lua * L) throw (GeneralException) { + void * handle = dlopen(("./" + fname + ".so").to_charp(), RTLD_NOW | RTLD_GLOBAL); + + if (!handle) { + throw GeneralException("File not found or error loading shared object file: " + fname + "; " + dlerror()); + } + + init_ptr_t init_ptr = (init_ptr_t) dlsym(handle, "init_plugin"); + + if (!init_ptr) { + throw GeneralException("No init pointer on plugin " + fname); + } + + init_ptr(L); +} +#endif |