#ifdef WIN32 #include "dll.h" #include "../MonitorLogging.h" DLLManager::DLLManager( const char *fname ) { // Try to open the library now and get any error message. LOG_DEBUG("calling LoadLibrary..") h = LoadLibrary(fname); LOG_DEBUG("LoadLib done.") if (h == NULL) { DWORD m; int errorCode=GetLastError() ; m = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, /* Instance */ errorCode, /* Message Number */ 0, /* Language */ (char*)&err, /* Buffer */ 0, /* Min/Max Buffer size */ NULL); /* Arguments */ LOG_ERROR("Error loading library \"" << fname << "\":" << err ) } else { err=NULL ; } } DLLManager::~DLLManager() { // Free error string if allocated LocalFree(err); // close the library if it isn't null if (h != NULL) FreeLibrary(h); } bool DLLManager::GetSymbol( void **v, const char *sym_name ) { // try extract a symbol from the library // get any error message is there is any if( h!=0 ) { *v = (void*) GetProcAddress(h, sym_name); if ((*v) != NULL) return true; else { FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, /* Instance */ GetLastError(), /* Message Number */ 0, /* Language */ err, /* Buffer */ 0, /* Min/Max Buffer size */ NULL); /* Arguments */ return false; } } else { return false; } } const char * DLLManager::GetDLLExtension() { return ".dll"; } DLLFactoryBase::DLLFactoryBase( const char *fname, const char *factory ) : DLLManager(fname) { // try get the factory function if there is no error yet factory_func=0; if( LastError()==0 ) { GetSymbol( (void **)&factory_func, factory ? factory : "factory0" ); } else { LOG_ERROR("Lasterror=" << LastError() ) } } DLLFactoryBase::~DLLFactoryBase() { } #endif /* WIN32 */