blob: 8682cd29d0d348eef20aa0f890d319a0138bd090 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#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
}
|