diff --git a/src/nvcore/CMakeLists.txt b/src/nvcore/CMakeLists.txt index e376686..435f907 100644 --- a/src/nvcore/CMakeLists.txt +++ b/src/nvcore/CMakeLists.txt @@ -19,7 +19,9 @@ SET(CORE_SRCS TextWriter.h TextWriter.cpp Radix.h - Radix.cpp) + Radix.cpp + Library.h + Library.cpp) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/nvcore/Library.cpp b/src/nvcore/Library.cpp new file mode 100644 index 0000000..179239c --- /dev/null +++ b/src/nvcore/Library.cpp @@ -0,0 +1,41 @@ + +#include "Library.h" +#include "Debug.h" + +#if NV_OS_WIN32 +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN +#include +#else +#include +#endif + + + +void * nvLoadLibrary(const char * name) +{ +#if NV_OS_WIN32 + return (void *)LoadLibraryExA( name, NULL, 0 ); +#else + return dlopen(name, RTLD_LAZY); +#endif +} + +void nvUnloadLibrary(void * handle) +{ + nvDebugCheck(handle != NULL); +#if NV_OS_WIN32 + FreeLibrary((HMODULE)handle); +#else + dlclose(handle); +#endif +} + +void * nvBindSymbol(void * handle, const char * symbol) +{ +#if NV_OS_WIN32 + return (void *)GetProcAddress((HMODULE)handle, symbol); +#else + return (void *)dlsym(handle, symbol); +#endif +} diff --git a/src/nvcore/Library.h b/src/nvcore/Library.h new file mode 100644 index 0000000..ee7d416 --- /dev/null +++ b/src/nvcore/Library.h @@ -0,0 +1,50 @@ +// This code is in the public domain -- castano@gmail.com + +#ifndef NV_CORE_LIBRARY_H +#define NV_CORE_LIBRARY_H + +#include + +#if NV_OS_WIN32 +#define LIBRARY_NAME(name) #name ".dll" +#elif NV_OS_DARWIN +#define NV_LIBRARY_NAME(name) "lib" #name ".dylib" +#else +#define NV_LIBRARY_NAME(name) "lib" #name ".so" +#endif + +NVCORE_API void * nvLoadLibrary(const char * name); +NVCORE_API void nvUnloadLibrary(void * lib); +NVCORE_API void * nvBindSymbol(void * lib, const char * symbol); + +class NVCORE_CLASS Library +{ +public: + Library(const char * name) + { + handle = nvLoadLibrary(name); + } + ~Library() + { + if (isValid()) + { + nvUnloadLibrary(handle); + } + } + + bool isValid() const + { + return handle != NULL; + } + + void * bindSymbol(const char * symbol) + { + return nvBindSymbol(handle, symbol); + } + +private: + void * handle; +}; + + +#endif // NV_CORE_LIBRARY_H