winamp/Src/Wasabi/bfc/loadlib.cpp
2024-09-24 14:54:57 +02:00

86 lines
1.4 KiB
C++

#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
}