mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
In 2006, Win32PluginProvider was removed from Windows builds:df5be19409Instead, SdlPluginProvider became the provider used in Window builds. Currently, no code uses Win32PluginProvider. The two classes are small and effectively do the same thing, but Win32PluginProvider has the advantage of using our Windows string conversion functions for paths, just like the rest of backend code. We've seen problems before where SDL handles encoding differently:0ab9653556
96 lines
2.8 KiB
C++
96 lines
2.8 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
// Disable symbol overrides so that we can use system headers.
|
|
#define FORBIDDEN_SYMBOL_ALLOW_ALL
|
|
|
|
#include "common/scummsys.h"
|
|
|
|
#if defined(DYNAMIC_MODULES) && defined(_WIN32)
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
|
|
#include "backends/platform/sdl/win32/win32_wrapper.h"
|
|
#include "backends/plugins/win32/win32-provider.h"
|
|
#include "backends/plugins/dynamic-plugin.h"
|
|
#include "common/debug.h"
|
|
#include "common/fs.h"
|
|
|
|
class Win32Plugin final : public DynamicPlugin {
|
|
protected:
|
|
void *_dlHandle;
|
|
|
|
VoidFunc findSymbol(const char *symbol) override {
|
|
FARPROC func = GetProcAddress((HMODULE)_dlHandle, symbol);
|
|
if (!func)
|
|
debug("Failed loading symbol '%s' from plugin '%s'", symbol, _filename.c_str());
|
|
|
|
return (void (*)())func;
|
|
}
|
|
|
|
public:
|
|
Win32Plugin(const Common::String &filename)
|
|
: DynamicPlugin(filename), _dlHandle(0) {}
|
|
|
|
bool loadPlugin() override {
|
|
assert(!_dlHandle);
|
|
TCHAR *tFilename = Win32::stringToTchar(_filename);
|
|
_dlHandle = LoadLibrary(tFilename);
|
|
free(tFilename);
|
|
|
|
if (!_dlHandle) {
|
|
warning("Failed loading plugin '%s' (error code %d)", _filename.c_str(), (int32) GetLastError());
|
|
return false;
|
|
} else {
|
|
debug(1, "Success loading plugin '%s', handle %p", _filename.c_str(), _dlHandle);
|
|
}
|
|
|
|
return DynamicPlugin::loadPlugin();
|
|
}
|
|
|
|
void unloadPlugin() override {
|
|
DynamicPlugin::unloadPlugin();
|
|
if (_dlHandle) {
|
|
if (!FreeLibrary((HMODULE)_dlHandle))
|
|
warning("Failed unloading plugin '%s'", _filename.c_str());
|
|
else
|
|
debug(1, "Success unloading plugin '%s'", _filename.c_str());
|
|
_dlHandle = 0;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
Plugin* Win32PluginProvider::createPlugin(const Common::FSNode &node) const {
|
|
return new Win32Plugin(node.getPath());
|
|
}
|
|
|
|
bool Win32PluginProvider::isPluginFilename(const Common::FSNode &node) const {
|
|
// Check the plugin suffix
|
|
Common::String filename = node.getName();
|
|
return filename.hasSuffix(".dll");
|
|
}
|
|
|
|
|
|
#endif // defined(DYNAMIC_MODULES) && defined(_WIN32)
|