From 9389e1ea052a0cfdc0ec8a9fe02009087c395cdc Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 12 Jan 2014 10:33:03 +0100 Subject: [PATCH] Changed DynLib internal Fixes the "Assimp32.dll not found" bug Former-commit-id: 662adba33c5d9cfbd23c8b0af0670626070baaa9 --- include/Nazara/Core/DynLib.hpp | 4 +--- src/Nazara/Audio/OpenAL.cpp | 2 +- src/Nazara/Core/DynLib.cpp | 8 ++------ src/Nazara/Core/PluginManager.cpp | 2 +- src/Nazara/Core/Posix/DynLibImpl.cpp | 17 +++++++++-------- src/Nazara/Core/Posix/DynLibImpl.hpp | 1 - src/Nazara/Core/Win32/DynLibImpl.cpp | 9 +++++++-- 7 files changed, 21 insertions(+), 22 deletions(-) diff --git a/include/Nazara/Core/DynLib.hpp b/include/Nazara/Core/DynLib.hpp index 27059e1b6..eecf0b8b7 100644 --- a/include/Nazara/Core/DynLib.hpp +++ b/include/Nazara/Core/DynLib.hpp @@ -33,8 +33,6 @@ class NzDynLibImpl; class NzDynLib : NzNonCopyable { - friend NzDynLibImpl; - public: NzDynLib(); NzDynLib(NzDynLib&& lib); @@ -45,7 +43,7 @@ class NzDynLib : NzNonCopyable bool IsLoaded() const; - bool Load(const NzString& libraryPath, bool appendExtension = true); + bool Load(const NzString& libraryPath); void Unload(); NzDynLib& operator=(NzDynLib&& lib); diff --git a/src/Nazara/Audio/OpenAL.cpp b/src/Nazara/Audio/OpenAL.cpp index 9b56c7928..4e4319e93 100644 --- a/src/Nazara/Audio/OpenAL.cpp +++ b/src/Nazara/Audio/OpenAL.cpp @@ -88,7 +88,7 @@ bool NzOpenAL::Initialize(bool openDevice) for (const char* path : libs) { NzString libPath(path); - if (!s_library.Load(libPath, false)) + if (!s_library.Load(libPath)) continue; try diff --git a/src/Nazara/Core/DynLib.cpp b/src/Nazara/Core/DynLib.cpp index 6ecba085e..62ceec4e5 100644 --- a/src/Nazara/Core/DynLib.cpp +++ b/src/Nazara/Core/DynLib.cpp @@ -61,18 +61,14 @@ bool NzDynLib::IsLoaded() const return m_impl != nullptr; } -bool NzDynLib::Load(const NzString& libraryPath, bool appendExtension) +bool NzDynLib::Load(const NzString& libraryPath) { NazaraLock(m_mutex) Unload(); - NzString path = libraryPath; - if (appendExtension && !path.EndsWith(NAZARA_DYNLIB_EXTENSION)) - path += NAZARA_DYNLIB_EXTENSION; - std::unique_ptr impl(new NzDynLibImpl(this)); - if (!impl->Load(path, &m_lastError)) + if (!impl->Load(libraryPath, &m_lastError)) { NazaraError("Failed to load library: " + m_lastError); return false; diff --git a/src/Nazara/Core/PluginManager.cpp b/src/Nazara/Core/PluginManager.cpp index 388a261a1..0c8e79927 100644 --- a/src/Nazara/Core/PluginManager.cpp +++ b/src/Nazara/Core/PluginManager.cpp @@ -83,7 +83,7 @@ bool NzPluginManager::Mount(const NzString& pluginPath, bool appendExtension) } std::unique_ptr library(new NzDynLib); - if (!library->Load(path, false)) + if (!library->Load(path)) { NazaraError("Failed to load plugin"); return false; diff --git a/src/Nazara/Core/Posix/DynLibImpl.cpp b/src/Nazara/Core/Posix/DynLibImpl.cpp index 1d25d1950..19378aeb2 100644 --- a/src/Nazara/Core/Posix/DynLibImpl.cpp +++ b/src/Nazara/Core/Posix/DynLibImpl.cpp @@ -8,12 +8,12 @@ #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 { /* Il n'est pas standard de cast un pointeur d'objet vers un pointeur de fonction. @@ -31,26 +31,27 @@ NzDynLibFunc NzDynLibImpl::GetSymbol(const NzString& symbol) const converter.pointer = dlsym(m_handle, symbol.GetConstBuffer()); if (!converter.pointer) - m_parent->SetLastError(dlerror()); + *errorMessage = dlerror(); return converter.func; } -bool NzDynLibImpl::Load(const NzString& libraryPath) +bool NzDynLibImpl::Load(const NzString& libraryPath, NzString* errorMessage) { NzString path = libraryPath; - if (!path.EndsWith(".so")) + + unsigned int pos = path.FindLast(".so"); + if (pos == NzString::npos || (path.GetLength() > pos+3 && path[pos+3] != '.')) path += ".so"; dlerror(); // Clear error flag - m_handle = dlopen(path.GetConstBuffer(), RTLD_LAZY | RTLD_GLOBAL); if (m_handle) return true; else { - m_parent->SetLastError(dlerror()); + *errorMessage = dlerror(); return false; } } diff --git a/src/Nazara/Core/Posix/DynLibImpl.hpp b/src/Nazara/Core/Posix/DynLibImpl.hpp index f5d49e5bc..efcdb0072 100644 --- a/src/Nazara/Core/Posix/DynLibImpl.hpp +++ b/src/Nazara/Core/Posix/DynLibImpl.hpp @@ -25,7 +25,6 @@ class NzDynLibImpl : NzNonCopyable private: void* m_handle; - NzDynLib* m_parent; }; #endif // NAZARA_DYNLIBIMPL_HPP diff --git a/src/Nazara/Core/Win32/DynLibImpl.cpp b/src/Nazara/Core/Win32/DynLibImpl.cpp index 5f79ddc2f..36af9314d 100644 --- a/src/Nazara/Core/Win32/DynLibImpl.cpp +++ b/src/Nazara/Core/Win32/DynLibImpl.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -25,8 +26,12 @@ NzDynLibFunc NzDynLibImpl::GetSymbol(const NzString& symbol, NzString* errorMess bool NzDynLibImpl::Load(const NzString& libraryPath, NzString* errorMessage) { - std::unique_ptr wPath(libraryPath.GetWideBuffer()); - m_handle = LoadLibraryW(wPath.get()); + NzString path = libraryPath; + if (!path.EndsWith(".dll")) + path += ".dll"; + + std::unique_ptr wPath(path.GetWideBuffer()); + m_handle = LoadLibraryExW(wPath.get(), nullptr, (NzFile::IsAbsolute(path)) ? LOAD_WITH_ALTERED_SEARCH_PATH : 0); if (m_handle) return true;