openspades/Sources/Core/DynamicLibrary.cpp
2013-08-18 16:18:06 +09:00

100 lines
1.9 KiB
C++

//
// DynamicLibrary.cpp
// OpenSpades
//
// Created by yvt on 7/14/13.
// Copyright (c) 2013 yvt.jp. All rights reserved.
//
#ifdef WIN32
#include "DynamicLibrary.h"
#include "Exception.h"
#include <windows.h>
#include "Debug.h"
namespace spades {
DynamicLibrary::DynamicLibrary(const char *fn){
SPADES_MARK_FUNCTION();
name = fn;
handle = (void *)LoadLibrary(fn);
if(handle == NULL){
DWORD err = GetLastError();
SPRaise("Failed to dlload '%s': 0x%08x", fn, (int)err);
}
}
DynamicLibrary::~DynamicLibrary() {
SPADES_MARK_FUNCTION();
FreeLibrary((HINSTANCE)handle);
}
void *DynamicLibrary::GetSymbolOrNull(const char *name){
SPADES_MARK_FUNCTION();
void *addr = (void*)GetProcAddress((HINSTANCE)handle, name);
return addr;
}
void *DynamicLibrary::GetSymbol(const char *sname){
SPADES_MARK_FUNCTION();
void *v = GetSymbolOrNull(sname);
if(v == NULL){
DWORD err = GetLastError();
SPRaise("Failed to find symbol '%s' in %s: 0x%08x", sname,
name.c_str(), err);
}
return v;
}
}
#else
#include "DynamicLibrary.h"
#include "Exception.h"
#include <dlfcn.h>
#include "Debug.h"
namespace spades {
DynamicLibrary::DynamicLibrary(const char *fn){
SPADES_MARK_FUNCTION();
name = fn;
handle = dlopen(fn, RTLD_LAZY);
if(handle == NULL){
std::string err = dlerror();
SPRaise("Failed to dlload '%s': %s", fn, err.c_str());
}
}
DynamicLibrary::~DynamicLibrary() {
SPADES_MARK_FUNCTION();
dlclose(handle);
}
void *DynamicLibrary::GetSymbolOrNull(const char *name){
SPADES_MARK_FUNCTION();
void *addr = dlsym(handle, name);
return addr;
}
void *DynamicLibrary::GetSymbol(const char *sname){
SPADES_MARK_FUNCTION();
void *v = GetSymbolOrNull(sname);
if(v == NULL){
std::string err = dlerror();
SPRaise("Failed to find symbol '%s' in %s: %s", sname,
name.c_str(), err.c_str());
}
return v;
}
}
#endif