#pragma once
#ifndef _SHAREDLIBRARY_H_
#define _SHAREDLIBRARY_H_
#include <string>
#if defined( _WIN32 )
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
#include <dlfcn.h>
#endif
inline void* LoadSharedLibrary( std::string unixPrefix, std::string libraryName, bool quiet )
{
#if defined( _WIN32 )
libraryName += ".dll";
HMODULE fileHandle = ::LoadLibraryExA( libraryName.c_str( ), NULL, NULL );
#elif defined(__linux__)
tstring linuxName = unixPrefix;
linuxName += libraryName += ".so";
void* fileHandle = ::dlopen( linuxName.c_str( ), RTLD_NOW );
if( !quiet && !fileHandle )
{
std::cerr << ::dlerror( ) << std::endl;
}
#elif defined(__APPLE__)
tstring appleName = unixPrefix;
appleName += libraryName += ".dylib";
void* fileHandle = ::dlopen( appleName.c_str( ), RTLD_NOW );
if( !quiet && !fileHandle )
{
std::cerr << ::dlerror( ) << std::endl;
}
#elif defined(__FreeBSD_kernel__)
tstring freebsdName = unixPrefix;
freebsdName += libraryName += ".so";
void* fileHandle = ::dlopen( freebsdName.c_str( ), RTLD_NOW );
if( !quiet && !fileHandle )
{
std::cerr << ::dlerror( ) << std::endl;
}
#else
#error "unsupported platform"
#endif
return fileHandle;
}
inline int FreeSharedLibrary( void*& libHandle )
{
int result = 0;
#if defined( _WIN32 )
if( libHandle != 0 )
result = ::FreeLibrary( reinterpret_cast< HMODULE >( libHandle ) );
#else
if( libHandle != 0 )
result = ( ::dlclose( libHandle ) == 0 );
#endif
libHandle = NULL;
return result;
}
inline void* LoadFunctionAddr( void* libHandle, std::string funcName )
{
if( libHandle == NULL )
return NULL;
#if defined( _WIN32 )
HMODULE fileHandle = reinterpret_cast< HMODULE >( libHandle );
void* pFunc = reinterpret_cast< void* >( ::GetProcAddress( fileHandle, funcName.c_str( ) ) );
#else
void* pFunc = ::dlsym( libHandle, funcName.c_str( ) );
#endif
return pFunc;
}
#endif