diff --git a/include/Nazara/Core/DynLib.hpp b/include/Nazara/Core/DynLib.hpp index c8b7d1984..856aee276 100644 --- a/include/Nazara/Core/DynLib.hpp +++ b/include/Nazara/Core/DynLib.hpp @@ -36,21 +36,21 @@ class NzDynLib : NzNonCopyable friend NzDynLibImpl; public: - NzDynLib(const NzString& libraryPath); + NzDynLib(); ~NzDynLib(); NzString GetLastError() const; NzDynLibFunc GetSymbol(const NzString& symbol) const; - bool Load(); + + bool IsLoaded() const; + + bool Load(const NzString& libraryPath, bool appendExtension = true); void Unload(); private: - void SetLastError(const NzString& error); - NazaraMutexAttrib(m_mutex, mutable) - NzString m_lastError; - NzString m_path; + mutable NzString m_lastError; NzDynLibImpl* m_impl; }; diff --git a/include/Nazara/Core/PluginManager.hpp b/include/Nazara/Core/PluginManager.hpp index bf989f2fc..083e2395f 100644 --- a/include/Nazara/Core/PluginManager.hpp +++ b/include/Nazara/Core/PluginManager.hpp @@ -22,7 +22,7 @@ class NAZARA_API NzPluginManager static bool Initialize(); static bool Mount(nzPlugin plugin); - static bool Mount(const NzString& pluginPath); + static bool Mount(const NzString& pluginPath, bool appendExtension = true); static void RemoveDirectory(const NzString& directoryPath); diff --git a/src/Nazara/Core/DynLib.cpp b/src/Nazara/Core/DynLib.cpp index 91d12cad7..0266a695d 100644 --- a/src/Nazara/Core/DynLib.cpp +++ b/src/Nazara/Core/DynLib.cpp @@ -16,8 +16,7 @@ #include -NzDynLib::NzDynLib(const NzString& libraryPath) : -m_path(libraryPath), +NzDynLib::NzDynLib() : m_impl(nullptr) { } @@ -46,17 +45,22 @@ NzDynLibFunc NzDynLib::GetSymbol(const NzString& symbol) const } #endif - return m_impl->GetSymbol(symbol); + return m_impl->GetSymbol(symbol, &m_lastError); } -bool NzDynLib::Load() +bool NzDynLib::IsLoaded() const +{ + return m_impl != nullptr; +} + +bool NzDynLib::Load(const NzString& libraryPath, bool appendExtension) { NazaraLock(m_mutex) Unload(); m_impl = new NzDynLibImpl(this); - if (!m_impl->Load(m_path)) + if (!m_impl->Load(libraryPath, appendExtension, &m_lastError)) { delete m_impl; m_impl = nullptr; @@ -78,10 +82,3 @@ void NzDynLib::Unload() m_impl = nullptr; } } - -void NzDynLib::SetLastError(const NzString& error) -{ - NazaraLock(m_mutex) - - m_lastError = error; -} diff --git a/src/Nazara/Core/PluginManager.cpp b/src/Nazara/Core/PluginManager.cpp index 8537fe1a8..b6e705d7c 100644 --- a/src/Nazara/Core/PluginManager.cpp +++ b/src/Nazara/Core/PluginManager.cpp @@ -58,10 +58,10 @@ bool NzPluginManager::Mount(nzPlugin plugin) return Mount(s_pluginFiles[plugin]); } -bool NzPluginManager::Mount(const NzString& pluginPath) +bool NzPluginManager::Mount(const NzString& pluginPath, bool appendExtension) { NzString path = pluginPath; - if (!path.EndsWith(NAZARA_DYNLIB_EXTENSION)) + if (appendExtension && !path.EndsWith(NAZARA_DYNLIB_EXTENSION)) path += NAZARA_DYNLIB_EXTENSION; bool exists = false; @@ -93,8 +93,8 @@ bool NzPluginManager::Mount(const NzString& pluginPath) return false; } - std::unique_ptr library(new NzDynLib(path)); - if (!library->Load()) + std::unique_ptr library(new NzDynLib); + if (!library->Load(path, false)) { NazaraError("Failed to load plugin"); return false; diff --git a/src/Nazara/Core/Win32/DynLibImpl.cpp b/src/Nazara/Core/Win32/DynLibImpl.cpp index 6b9a99bac..6fe3426b4 100644 --- a/src/Nazara/Core/Win32/DynLibImpl.cpp +++ b/src/Nazara/Core/Win32/DynLibImpl.cpp @@ -9,34 +9,34 @@ #include #include -NzDynLibImpl::NzDynLibImpl(NzDynLib* parent) : -m_parent(parent) +NzDynLibImpl::NzDynLibImpl(NzDynLib* parent) { + NazaraUnused(parent); } -NzDynLibFunc NzDynLibImpl::GetSymbol(const NzString& symbol) const +NzDynLibFunc NzDynLibImpl::GetSymbol(const NzString& symbol, NzString* errorMessage) const { NzDynLibFunc sym = reinterpret_cast(GetProcAddress(m_handle, symbol.GetConstBuffer())); if (!sym) - m_parent->SetLastError(NzError::GetLastSystemError()); + *errorMessage = NzError::GetLastSystemError(); return sym; } -bool NzDynLibImpl::Load(const NzString& libraryPath) +bool NzDynLibImpl::Load(const NzString& libraryPath, bool appendExtension, NzString* errorMessage) { NzString path = libraryPath; - if (!path.EndsWith(".dll")) + if (appendExtension && !path.EndsWith(".dll")) path += ".dll"; std::unique_ptr wPath(path.GetWideBuffer()); - m_handle = LoadLibraryExW(wPath.get(), nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); + m_handle = LoadLibraryW(wPath.get()); if (m_handle) return true; else { - m_parent->SetLastError(NzError::GetLastSystemError()); + *errorMessage = NzError::GetLastSystemError(); return false; } } diff --git a/src/Nazara/Core/Win32/DynLibImpl.hpp b/src/Nazara/Core/Win32/DynLibImpl.hpp index ac788bb34..1625cd388 100644 --- a/src/Nazara/Core/Win32/DynLibImpl.hpp +++ b/src/Nazara/Core/Win32/DynLibImpl.hpp @@ -19,13 +19,12 @@ class NzDynLibImpl : NzNonCopyable NzDynLibImpl(NzDynLib* m_parent); ~NzDynLibImpl() = default; - NzDynLibFunc GetSymbol(const NzString& symbol) const; - bool Load(const NzString& libraryPath); + NzDynLibFunc GetSymbol(const NzString& symbol, NzString* errorMessage) const; + bool Load(const NzString& libraryPath, bool appendExtension, NzString* errorMessage); void Unload(); private: HMODULE m_handle; - NzDynLib* m_parent; }; #endif // NAZARA_DYNLIBIMPL_HPP