diff options
-rw-r--r-- | base/plugins.cpp | 40 | ||||
-rw-r--r-- | base/plugins.h | 8 | ||||
-rw-r--r-- | common/scummsys.h | 7 |
3 files changed, 50 insertions, 5 deletions
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 diff --git a/common/scummsys.h b/common/scummsys.h index 60972da38c..a0ba3622c1 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -53,6 +53,7 @@ #define FORCEINLINE __forceinline #define NORETURN _declspec(noreturn) + #define PLUGIN_EXPORT __declspec(dllexport) typedef unsigned char byte; typedef unsigned char uint8; @@ -92,6 +93,8 @@ #define START_PACK_STRUCTS pack (push, 1) #define END_PACK_STRUCTS pack(pop) + #define PLUGIN_EXPORT __declspec(dllexport) + #elif defined(UNIX) #define scumm_stricmp strcasecmp @@ -322,6 +325,10 @@ #define CDECL #endif +#ifndef PLUGIN_EXPORT +#define PLUGIN_EXPORT +#endif + #ifndef NORETURN #define NORETURN #endif |