From 119bf2ef953350e14d7ec5b0ee4a1f2a4a35043f Mon Sep 17 00:00:00 2001 From: Rosalie Wanders Date: Thu, 8 Oct 2020 11:45:16 +0200 Subject: [PATCH] work --- Source/3rdParty/CMakeLists.txt | 2 +- Source/RMG/CMakeLists.txt | 10 ++++++++++ Source/RMG/M64P/Macros.hpp | 20 ++++--------------- Source/RMG/M64P/Wrapper/Api.cpp | 6 +++--- Source/RMG/M64P/Wrapper/Plugin.cpp | 4 ++-- Source/RMG/M64P/dynlib.hpp | 17 ++++++++++++++++ Source/RMG/M64P/dynlib_unix.cpp | 22 ++++++++++++++++++++ Source/RMG/M64P/dynlib_win32.cpp | 32 ++++++++++++++++++++++++++++++ 8 files changed, 91 insertions(+), 22 deletions(-) create mode 100644 Source/RMG/M64P/dynlib.hpp create mode 100644 Source/RMG/M64P/dynlib_unix.cpp create mode 100644 Source/RMG/M64P/dynlib_win32.cpp diff --git a/Source/3rdParty/CMakeLists.txt b/Source/3rdParty/CMakeLists.txt index af143ade..22ba8edc 100644 --- a/Source/3rdParty/CMakeLists.txt +++ b/Source/3rdParty/CMakeLists.txt @@ -104,7 +104,7 @@ ExternalProject_Add(mupen64plus-video-GLideN64 SOURCE_DIR mupen64plus-video-GLideN64 GIT_REPOSITORY https://github.com/gonetz/GLideN64 - GIT_TAG 00dac336f897828b542e66aca74f6755d689e195 + GIT_TAG b200b33b849f38182b7d0b7371df064eb8864bf5 INSTALL_COMMAND "" diff --git a/Source/RMG/CMakeLists.txt b/Source/RMG/CMakeLists.txt index 0af8dac3..e6f223b0 100644 --- a/Source/RMG/CMakeLists.txt +++ b/Source/RMG/CMakeLists.txt @@ -36,6 +36,16 @@ set(RMG_SOURCES main.cpp ) +if (WIN32 OR MSYS) + list(APPEND RMG_SOURCES + M64P/dynlib_win32.cpp + ) +else() + list(APPEND RMG_SOURCES + M64P/dynlib_unix.cpp + ) +endif() + if (CMAKE_BUILD_TYPE MATCHES Release) add_executable(RMG WIN32 ${RMG_SOURCES}) else() diff --git a/Source/RMG/M64P/Macros.hpp b/Source/RMG/M64P/Macros.hpp index 58c27e70..f08e0e94 100644 --- a/Source/RMG/M64P/Macros.hpp +++ b/Source/RMG/M64P/Macros.hpp @@ -10,28 +10,16 @@ #ifndef M64P_MACROS_HPP #define M64P_MACROS_HPP -#ifdef _WIN32 -#include -#define DLOPEN(lib) LoadLibrary(lib) -#define DLCLOSE(lib) FreeLibrary(lib) -#define DLSYM(lib, func) GetProcAddress(lib, func) -#define DLGETERRSTR() GetLastError() -#else -#include -#define DLOPEN(lib) dlopen(lib, RTLD_LAZY) -#define DLCLOSE(lib) dlclose(lib) -#define DLSYM(lib, func) dlsym(lib, func) -#define DLGETERRSTR() dlerror() -#endif +#include "dynlib.hpp" #define HOOK_FUNC_OPT(handle, prevar, var) \ - this->var = (ptr_##prevar##var)DLSYM(handle, #prevar#var); + this->var = (ptr_##prevar##var)dynlib_sym(handle, #prevar#var); #define HOOK_FUNC(handle, prevar, var) \ - this->var = (ptr_##prevar##var)DLSYM(handle, #prevar#var); \ + this->var = (ptr_##prevar##var)dynlib_sym(handle, #prevar#var); \ if (this->var == nullptr) \ { \ - this->error_Message += DLGETERRSTR(); \ + this->error_Message += dynlib_strerror(); \ return false; \ } diff --git a/Source/RMG/M64P/Wrapper/Api.cpp b/Source/RMG/M64P/Wrapper/Api.cpp index d214da30..ccd12051 100644 --- a/Source/RMG/M64P/Wrapper/Api.cpp +++ b/Source/RMG/M64P/Wrapper/Api.cpp @@ -70,10 +70,10 @@ bool Api::core_Handle_Open(QString file) { this->core_Handle_Close(); - this->core_Handle = DLOPEN(file.toStdString().c_str()); + this->core_Handle = dynlib_open((char*)file.toStdString().c_str()); if (this->core_Handle == NULL) { - this->error_Message += DLGETERRSTR(); + this->error_Message += dynlib_strerror(); return false; } @@ -87,7 +87,7 @@ void Api::core_Handle_Close(void) if (!this->core_Handle_Opened) return; - DLCLOSE(this->core_Handle); + dynlib_close(this->core_Handle); this->core_Handle_Opened = false; } diff --git a/Source/RMG/M64P/Wrapper/Plugin.cpp b/Source/RMG/M64P/Wrapper/Plugin.cpp index 637cc57b..494c012f 100644 --- a/Source/RMG/M64P/Wrapper/Plugin.cpp +++ b/Source/RMG/M64P/Wrapper/Plugin.cpp @@ -27,13 +27,13 @@ bool Plugin::Init(QString file, m64p_dynlib_handle coreHandle) m64p_error ret; this->fileName = file; - this->handle = DLOPEN(file.toStdString().c_str()); + this->handle = dynlib_open((char*)file.toStdString().c_str()); this->error_Message = "Plugin::Init Failed: "; if (this->handle == NULL) { - this->error_Message += DLGETERRSTR(); + this->error_Message += dynlib_strerror(); return false; } diff --git a/Source/RMG/M64P/dynlib.hpp b/Source/RMG/M64P/dynlib.hpp new file mode 100644 index 00000000..cf129016 --- /dev/null +++ b/Source/RMG/M64P/dynlib.hpp @@ -0,0 +1,17 @@ +#ifndef DYNLIB_HPP +#define DYNLIB_HPP + +#ifdef _WIN32 +#include +HMODULE dynlib_open(char *); +void dynlib_close(HMODULE); +FARPROC dynlib_sym(HMODULE, char *); +#else +void *dynlib_open(const char *); +void dynlib_close(void *); +void *dynlib_sym(void *, const char *); +#endif // _WIN32 + +QString dynlib_strerror(void); + +#endif // DYNLIB_HPP \ No newline at end of file diff --git a/Source/RMG/M64P/dynlib_unix.cpp b/Source/RMG/M64P/dynlib_unix.cpp new file mode 100644 index 00000000..9f748f60 --- /dev/null +++ b/Source/RMG/M64P/dynlib_unix.cpp @@ -0,0 +1,22 @@ +#include "dynlib.hpp" +#include + +void *dynlib_open(const char * file) +{ + return dlopen(file, RTLD_LAZY); +} + +void dynlib_close(void * dynlib) +{ + dlclose(dynlib); +} + +void *dynlib_sym(void* dynlib, const char * sym) +{ + return dlsym(dynlib, sym); +} + +QString dynlib_strerror(void) +{ + return QString::fromStdString(dlerror()); +} diff --git a/Source/RMG/M64P/dynlib_win32.cpp b/Source/RMG/M64P/dynlib_win32.cpp new file mode 100644 index 00000000..b00fe700 --- /dev/null +++ b/Source/RMG/M64P/dynlib_win32.cpp @@ -0,0 +1,32 @@ +#include "dynlib.hpp" +#include + +HMODULE dynlib_open(char *file) +{ + return LoadLibrary(file) +} + +void dynlib_close(HMODULE dynlib) +{ + FreeLibrary(dynlib); +} + +void *dynlib_sym(HMODULE dynlib, char *sym) +{ + return GetProcAddress(dynlib, sym); +} + +QString dynlib_strerror(void) +{ + DWORD err = GetLastError(); + LPSTR buf = nullptr; + + size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL); + + std::string msg(buf, size); + + LocalFree(buf); + + return QString::fromStdString(msg); +}