C语言如何开发简单的插件
Posted 明将军
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何开发简单的插件相关的知识,希望对你有一定的参考价值。
linux 通过dlopen来实现:
#include "polygon.h" #include <stdlib.h> #include <dlfcn.h> int main() { typedef CPolygon* create_t(); void * handle = dlopen("./triangle.so", RTLD_LAZY); if( !handle ) { std::cerr << dlerror() << std::endl; exit(1); } create_t * create_triangle = (create_t *)dlsym(handle, "create"); CPolygon * pObj = create_triangle(); if( 0 != pObj ) { pObj->area(); } delete pObj; dlclose(handle); return 0; }
生成动态库:g++ -fPIC -shared triangle.cpp -o triangle.so
生成test主函数:g++ -fPIC test.cpp -ldl -o test
具体demo:http://files.cnblogs.com/files/hero4china/plugins_1.zip
/***************************************************************************/ /* dynclass.h */ /* 使用的时候#include "dynclass.h",在类的声明后使用DYNCLASS(类名)注册*/ /***************************************************************************/ #ifndef __DYNAMIC_H__ #define __DYNAMIC_H__ #include <cstdio> #include <string> #include <typeinfo> #include <cstring> #if !defined ( DYN_DECLARE ) #define DYN_DECLARE(class_name) DYN_CLASS::CFactory<class_name> class_name #endif #if !defined ( DYN_CREATE ) #define DYN_CREATE(class_name) DYN_CLASS::Create(class_name) #endif namespace DYN_CLASS { /* create object by class name */ void * Create( const char * class_name ); /* interface of class factory*/ class CAbstractFactory { public: virtual void * Create( const char * class_name ) = 0; }; /* list of class factory */ class CFactoryList { friend void * Create( const char * class_name ); private: static CFactoryList * _head; CFactoryList * m_next; CAbstractFactory * m_item; public: CFactoryList( CAbstractFactory * fact ); virtual ~CFactoryList( void ); }; /* ctor of CFactoryList, add a class factory to list */ inline CFactoryList::CFactoryList( CAbstractFactory * fact ) : m_item( fact ) { m_next = _head; _head = this; } #if defined ( _MSC_VER ) /* disable warning for the following line : CFactory( void ): m_item( this ) {} */ #pragma warning(disable : 4355) #endif /* realization of class factory */ template <class t> class CFactory: public CAbstractFactory { static t _object; CFactoryList m_item; public: /* add itself to list of class factory when constructed */ CFactory( void ) : m_item( this ) {} virtual ~CFactory() {} /* create object of this class if matched */ void * Create( const char * class_name ) { std::string strClassName; #if defined (_MSC_VER ) strClassName = ( "class " ); #else char szSize[4] = {0}; sprintf(szSize, "%d", strlen(class_name) ); strClassName = szSize; #endif strClassName += class_name; printf("%s vs %s \\n", typeid(_object).name(), strClassName.c_str()); /* RTTI support */ return !strcmp( typeid(_object).name(), strClassName.c_str() ) ? (void*)( new t ) : 0 ; } }; } #endif /* __DYNAMIC_H__ */
/***************************************************************************/ /* dynclass.cpp */ /***************************************************************************/ #include "dynclass.h" namespace DYN_CLASS { CFactoryList * CFactoryList::_head = 0; void *Create( const char * class_name ) { void * new_object = 0; const CFactoryList * cur = CFactoryList::_head; for( ; cur ; cur = cur->m_next ) { printf("find \\n"); /* if class_name matched, object will then be created and returned */ if( new_object = cur->m_item->Create(class_name) ) { break; } } return new_object; } /* delete linkage from CFactoryList when some class factory destroyed */ CFactoryList::~CFactoryList( void ) { CFactoryList ** m_nextp = &CFactoryList::_head; for( ; *m_nextp ; m_nextp = &(*m_nextp)->m_next ) if( *m_nextp == this ) { *m_nextp = (*m_nextp)->m_next; break; } } }
参考:
- Why does C++ not have reflection?
- How can I add reflection to a C++ application?
- https://my.oschina.net/u/1450061/blog/204563
-
https://my.oschina.net/u/1450061/blog/204608
-
https://my.oschina.net/u/1450061/blog/204564
-
http://m.blog.csdn.net/article/details?id=9254239
-
http://blog.csdn.net/dengyunze/article/details/763558
-
http://www.ithao123.cn/content-9688046.html
以上是关于C语言如何开发简单的插件的主要内容,如果未能解决你的问题,请参考以下文章
将vscode打造成无敌的IDE初步探索vscode,解放生产力