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

📄 pluginhelper.cpp

📁 linux下C++实现插件技术,详情请见http://masterdog.bokee.com/563395.html
💻 CPP
字号:
#include "pluginhelper.h"CPluginHelper::CPluginHelper(){}CPluginHelper::~CPluginHelper(){}std::vector< std::string > CPluginHelper::GetFileNameByPattern( std::string dir, const std::string & pattern ){    std::vector<std::string> file_name_set;        if( dir.empty() )    {        dir = "./";    }    else if( dir[dir.length()-1] != '/' )    {        dir += '/';    }        std::string strCmd = "ls " +	dir + pattern;		FILE * fp = popen(strCmd.c_str(), "r" );		if(!fp)	{		std::cerr << "fail to gain file-list" << std::endl;		return file_name_set;	}	char buf[BUF_SIZE];	while( fgets(buf, BUF_SIZE, fp) )	{		char * ws = strpbrk(buf, " \t\n");				if(ws)		{		    *ws = '\0';		}		file_name_set.push_back( std::string(buf) );	}		pclose(fp);	    return file_name_set;}void CPluginHelper::Load( const std::string & dir, const std::string & pattern ){    std::vector<std::string> soNameList = GetFileNameByPattern(dir, pattern);        int	i;    for( i = 0; i < soNameList.size(); i++ )	{	    std::map< std::string, void* >::iterator itrSoName = m_SoNameTable.find( soNameList[i] );	    	    /* so-library has already loaded */	    if( itrSoName != m_SoNameTable.end() )	    {	        continue;	    }	    		void * handle = dlopen( soNameList[i].c_str(), RTLD_LAZY );				/* the very so-library file not exist */		if( !handle )    	{    		std::cerr << dlerror() << std::endl;    		continue;    	}    	    	/* insert to SoNameTable */    	m_SoNameTable[ soNameList[i] ] = handle;	}	    return;}void CPluginHelper::Unload( const std::string & dir, const std::string & pattern ){    std::vector<std::string> soNameList = GetFileNameByPattern(dir, pattern);        int	i;    for( i = 0; i < soNameList.size(); i++ )	{	    std::map< std::string, void* >::iterator itrSoName = m_SoNameTable.find( soNameList[i] );	    if( itrSoName != m_SoNameTable.end() )	    {	        void * handle = itrSoName->second;	        	        /* remove SoName */    	    m_SoNameTable.erase(itrSoName);    	        		/* close so-library */    		dlclose(handle);	    }	    	}	    return;}void * CPluginHelper::Create( const std::string & className ){    std::map< std::string, void* >::iterator itrClassName = m_ClassNameTable.find( className );        CreateOBJ_T	*  create = 0;    void * pObj = 0;       /* class name found in ClassNameTable */    if( itrClassName != m_ClassNameTable.end() )	{	    if( 0 != itrClassName->second )	    {	        create = (CreateOBJ_T *)dlsym(itrClassName->second, "createByClassName");	        	        if( create )            {	            pObj = create( className.c_str() );	        }	    }	}	/* class name not found in ClassNameTable */	else	{        std::map< std::string, void* >::iterator itrSoName = m_SoNameTable.begin();                /* traverse through SoNameTable */        for( ; itrSoName != m_SoNameTable.end(); ++itrSoName )        {            create = (CreateOBJ_T *)dlsym(itrSoName->second, "createByClassName");                        if( create )            {                pObj = create( className.c_str() );                                if( pObj )                {                    break;                }            }                 }	}          return pObj;}

⌨️ 快捷键说明

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