From bc65eb8ea51944c13a23ea4a7d1b54d228c5b7ea Mon Sep 17 00:00:00 2001 From: Paweł Kołodziejski Date: Sun, 5 Jun 2005 12:55:33 +0000 Subject: added code for loading dynamic plugins(DLLs) for windows svn-id: r18356 --- base/plugins.cpp | 40 +++++++++++++++++++++++++++++++++++++++- base/plugins.h | 8 ++++---- 2 files changed, 43 insertions(+), 5 deletions(-) (limited to 'base') diff --git a/base/plugins.cpp b/base/plugins.cpp index 695ed6ede6..1dbcf4609f 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -47,9 +47,15 @@ typedef DetectedGameList (*DetectFunc)(const FSList &fslist); #define PLUGIN_PREFIX "" #define PLUGIN_SUFFIX ".plg" #else +#ifdef _WIN32 +#define PLUGIN_DIRECTORY "" +#define PLUGIN_PREFIX "" +#define PLUGIN_SUFFIX ".dll" +#else #error No support for loading plugins on non-unix systems at this point! #endif #endif +#endif #else @@ -138,24 +144,44 @@ public: }; void *DynamicPlugin::findSymbol(const char *symbol) { -#if defined(UNIX)||defined(__DC__) +#if defined(UNIX) || defined(__DC__) void *func = dlsym(_dlHandle, symbol); if (!func) warning("Failed loading symbol '%s' from plugin '%s' (%s)", symbol, _filename.c_str(), dlerror()); return func; #else +#if defined(_WIN32) + void *func = GetProcAddress((HMODULE)_dlHandle, symbol); + if (!func) + warning("Failed loading symbol '%s' from plugin '%s'", symbol, _filename.c_str()); + return func; +#else #error TODO #endif +#endif } bool DynamicPlugin::loadPlugin() { assert(!_dlHandle); +#if defined(UNIX) || defined(__DC__) _dlHandle = dlopen(_filename.c_str(), RTLD_LAZY); if (!_dlHandle) { warning("Failed loading plugin '%s' (%s)", _filename.c_str(), dlerror()); return false; } +#else +#if defined(_WIN32) + _dlHandle = LoadLibrary(_filename.c_str()); + + if (!_dlHandle) { + warning("Failed loading plugin '%s'", _filename.c_str()); + return false; + } +#else +#error TODO +#endif +#endif // Query the plugin's name NameFunc nameFunc = (NameFunc)findSymbol("PLUGIN_name"); @@ -195,11 +221,23 @@ bool DynamicPlugin::loadPlugin() { } void DynamicPlugin::unloadPlugin() { +#if defined(UNIX) || defined(__DC__) if (_dlHandle) { if (dlclose(_dlHandle) != 0) warning("Failed unloading plugin '%s' (%s)", _filename.c_str(), dlerror()); } } +#else +#if defined(_WIN32) + if (_dlHandle) { + if (!FreeLibrary((HMODULE)_dlHandle)) + warning("Failed unloading plugin '%s'", _filename.c_str()); + } +} +#else +#error TODO +#endif +#endif #endif // DYNAMIC_MODULES diff --git a/base/plugins.h b/base/plugins.h index f9a5567834..11eb4a3e3f 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -92,10 +92,10 @@ public: #else #define REGISTER_PLUGIN(ID,name) \ extern "C" { \ - const char *PLUGIN_name() { return name; } \ - GameList PLUGIN_getSupportedGames() { return Engine_##ID##_gameList(); } \ - Engine *PLUGIN_createEngine(GameDetector *detector, OSystem *syst) { return Engine_##ID##_create(detector, syst); } \ - DetectedGameList PLUGIN_detectGames(const FSList &fslist) { return Engine_##ID##_detectGames(fslist); } \ + PLUGIN_EXPORT const char *PLUGIN_name() { return name; } \ + PLUGIN_EXPORT GameList PLUGIN_getSupportedGames() { return Engine_##ID##_gameList(); } \ + PLUGIN_EXPORT Engine *PLUGIN_createEngine(GameDetector *detector, OSystem *syst) { return Engine_##ID##_create(detector, syst); } \ + PLUGIN_EXPORT DetectedGameList PLUGIN_detectGames(const FSList &fslist) { return Engine_##ID##_detectGames(fslist); } \ } #endif -- cgit v1.2.3