#include "precomp_wasabi_bfc.h" #include "loadlib.h" #if !defined(WIN32) && !defined(LINUX) #error port me #endif Library::Library(const wchar_t *filename) : NamedW(filename) { lib = NULL; } Library::~Library() { unload(); } int Library::load(const wchar_t *newname) { if (lib != NULL && newname == NULL) return 1; unload(); if (newname != NULL) setName(newname); const wchar_t *n = getName(); ASSERT(n != NULL); #ifdef WIN32 __try { lib = LoadLibraryW(n); } __except(EXCEPTION_EXECUTE_HANDLER) { // stupid DLL lib = NULL; OutputDebugString(L"exception while loading dll"); OutputDebugStringW(newname); OutputDebugString(L"\n"); } #elif defined(LINUX) // Not using string to try to not use common/wasabi in Studio.exe char *conv = _strdup( getName() ); int len = strlen( conv ); if ( ! strcasecmp( conv + len - 4, ".dll" ) ) { strcpy( conv + len - 4, ".so" ); } lib = dlopen(conv, RTLD_LAZY); free( conv ); #else #error port me! #endif if (lib == NULL) return 0; return 1; } void Library::unload() { if (lib != NULL) { #ifdef WIN32 FreeLibrary(lib); #elif defined(LINUX) dlclose(lib); #else #error port me! #endif } lib = NULL; } void *Library::getProcAddress(const char *procname) { ASSERT(procname != NULL); #if defined(WIN32) return GetProcAddress(lib, procname); #elif defined(LINUX) return dlsym(lib, procname); #else #error port me! #endif }