⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dynamicmodules.cpp

📁 遗传算法的一个库
💻 CPP
字号:
#include <GradSoft/DynamicModules.h>/* * (C) Grad-Soft Ltd, Kiev, Ukraine. 2001-2002 * http://www.gradsoft.kiev.ua * $Id: DynamicModules.cpp,v 1.12 2002/04/05 20:25:47 rssh Exp $ */#ifdef WIN32#include <windows.h>#include <lmerr.h>#include <algorithm>#else#include <dlfcn.h>#endif#include <iostream>namespace GradSoft{#ifdef WIN32typedef DynamicModule* (*__GET_DYNAMIC_MODULE)(void);void fillErrorText(DWORD dwLastError, std::string& errorText){    HMODULE hModule = NULL; // default to system source    LPSTR MessageBuffer;    DWORD dwBufferLength;    DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |        FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM ;    if (dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) {        hModule = LoadLibraryEx(TEXT("netmsg.dll"), NULL                , LOAD_LIBRARY_AS_DATAFILE);        if (hModule != NULL) dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;    }    if (dwBufferLength = FormatMessageA(dwFormatFlags, hModule, dwLastError,        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &MessageBuffer, 0,        NULL)) {        errorText.assign(MessageBuffer, dwBufferLength);        LocalFree(MessageBuffer);    }    if(hModule != NULL) FreeLibrary(hModule);}#endifDynamicModule& DynamicModules::load(const char* name,const char* path)                                          {  std::string sPath(path);#ifdef WIN32  sPath += ".dll";  std::replace(sPath.begin(), sPath.end(), '/', '\\');  HINSTANCE dlDescriptor = LoadLibrary(sPath.c_str());  if (dlDescriptor == NULL) {   std::string message;   fillErrorText(GetLastError(), message);   throw Error(message.c_str());   }  __GET_DYNAMIC_MODULE f = (__GET_DYNAMIC_MODULE)GetProcAddress(dlDescriptor, "__getDynamicModule");  if (f == NULL) {   throw Error("Dynamic modules object not exported");   }  DynamicModule* m = f();#else  sPath += ".so";  void * dlDescriptor = dlopen(sPath.c_str(), RTLD_LAZY|RTLD_GLOBAL);  if (dlDescriptor==NULL) {   std::cerr << "dlDescriptor==NULL" << std::endl;   const char* message = dlerror();   std::cerr << message << std::endl;   throw Error(message);   }  void* sObject = dlsym(dlDescriptor,name);  if (sObject==NULL) {   std::cerr << "sObject==NULL" << std::endl;   const char* message = dlerror();   throw Error(message);   }  DynamicModule* m = (DynamicModule*)sObject;#endif  std::string strName(name);  Entry e(dlDescriptor,m);  dlMap()[strName]=e;  return *m;}void  DynamicModules::unload(const char* name){  std::string strName(name);  StorageType& dlmap = dlMap();  StorageIteratorType it = dlmap.find(strName);  if (it==dlmap.end()) {    std::cerr << "Can't find loaded module with name " << name << std::endl;    return;  }#ifdef WIN32  FreeLibrary((*it).second.descriptor);#else  dlclose((*it).second.descriptor);#endif  dlmap.erase(it);}DynamicModule& DynamicModules::getModule(const char* name, const char* path){  std::string strName(name);  StorageType& dlmap = dlMap();  StorageIteratorType it = dlmap.find(strName);  if (it==dlmap.end()) {    return load(name,path);  }else{    return *((*it).second.module_p);   }}DynamicModules::Enumerator::Enumerator(){ it_=DynamicModules::dlMap().begin();}DynamicModule& DynamicModules::Enumerator::next(){ if (it_==DynamicModules::dlMap().end())   throw DynamicModules::Error("DynamicModules:Enumerator:OutOfRange"); return *((*it_).second.module_p);}bool DynamicModules::Enumerator::more() const{ return (it_!=DynamicModules::dlMap().end());}DynamicModules::Enumerator DynamicModules::createEnumerator(){ Enumerator retval; retval.it_ = dlMap().begin(); return retval;}DynamicModules DynamicModules::singleton_;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -