linux 通过dlopen来实现:

  1. #include "polygon.h"
  2. #include <stdlib.h>
  3. #include <dlfcn.h>
  4.  
  5. int main()
  6. {
  7. typedef CPolygon* create_t();
  8.  
  9. void * handle = dlopen("./triangle.so", RTLD_LAZY);
  10.  
  11. if( !handle )
  12. {
  13. std::cerr << dlerror() << std::endl;
  14. exit();
  15. }
  16.  
  17. create_t * create_triangle = (create_t *)dlsym(handle, "create");
  18.  
  19. CPolygon * pObj = create_triangle();
  20.  
  21. if( != pObj )
  22. {
  23. pObj->area();
  24. }
  25.  
  26. delete pObj;
  27.  
  28. dlclose(handle);
  29. return ;
  30. }

生成动态库: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

  1. /***************************************************************************/
  2. /* dynclass.h */
  3. /* 使用的时候#include "dynclass.h",在类的声明后使用DYNCLASS(类名)注册*/
  4. /***************************************************************************/
  5.  
  6. #ifndef __DYNAMIC_H__
  7. #define __DYNAMIC_H__
  8.  
  9. #include <cstdio>
  10. #include <string>
  11. #include <typeinfo>
  12. #include <cstring>
  13.  
  14. #if !defined ( DYN_DECLARE )
  15. #define DYN_DECLARE(class_name) DYN_CLASS::CFactory<class_name> class_name
  16. #endif
  17.  
  18. #if !defined ( DYN_CREATE )
  19. #define DYN_CREATE(class_name) DYN_CLASS::Create(class_name)
  20. #endif
  21.  
  22. namespace DYN_CLASS
  23. {
  24. /* create object by class name */
  25. void * Create( const char * class_name );
  26.  
  27. /* interface of class factory*/
  28. class CAbstractFactory
  29. {
  30. public:
  31. virtual void * Create( const char * class_name ) = ;
  32. };
  33.  
  34. /* list of class factory */
  35. class CFactoryList
  36. {
  37. friend void * Create( const char * class_name );
  38. private:
  39. static CFactoryList * _head;
  40. CFactoryList * m_next;
  41. CAbstractFactory * m_item;
  42. public:
  43. CFactoryList( CAbstractFactory * fact );
  44. virtual ~CFactoryList( void );
  45. };
  46.  
  47. /* ctor of CFactoryList, add a class factory to list */
  48. inline CFactoryList::CFactoryList( CAbstractFactory * fact )
  49. : m_item( fact )
  50. {
  51. m_next = _head;
  52. _head = this;
  53. }
  54.  
  55. #if defined ( _MSC_VER )
  56. /* disable warning for the following line : CFactory( void ): m_item( this ) {} */
  57. #pragma warning(disable : 4355)
  58. #endif
  59.  
  60. /* realization of class factory */
  61. template <class t>
  62. class CFactory: public CAbstractFactory
  63. {
  64. static t _object;
  65. CFactoryList m_item;
  66.  
  67. public:
  68.  
  69. /* add itself to list of class factory when constructed */
  70. CFactory( void ) : m_item( this ) {}
  71.  
  72. virtual ~CFactory() {}
  73.  
  74. /* create object of this class if matched */
  75. void * Create( const char * class_name )
  76. {
  77. std::string strClassName;
  78.  
  79. #if defined (_MSC_VER )
  80. strClassName = ( "class " );
  81. #else
  82. char szSize[] = {};
  83. sprintf(szSize, "%d", strlen(class_name) );
  84. strClassName = szSize;
  85. #endif
  86. strClassName += class_name;
  87. printf("%s vs %s \n", typeid(_object).name(), strClassName.c_str());
  88. /* RTTI support */
  89. return !strcmp( typeid(_object).name(), strClassName.c_str() )
  90. ? (void*)( new t ) : ;
  91.  
  92. }
  93. };
  94. }
  95. #endif /* __DYNAMIC_H__ */
  1. /***************************************************************************/
  2. /* dynclass.cpp */
  3. /***************************************************************************/
  4. #include "dynclass.h"
  5.  
  6. namespace DYN_CLASS
  7. {
  8. CFactoryList * CFactoryList::_head = ;
  9.  
  10. void *Create( const char * class_name )
  11. {
  12. void * new_object = ;
  13. const CFactoryList * cur = CFactoryList::_head;
  14.  
  15. for( ; cur ; cur = cur->m_next )
  16. {
  17. printf("find \n");
  18. /* if class_name matched, object will then be created and returned */
  19. if( new_object = cur->m_item->Create(class_name) )
  20. {
  21. break;
  22. }
  23. }
  24.  
  25. return new_object;
  26. }
  27.  
  28. /* delete linkage from CFactoryList when some class factory destroyed */
  29. CFactoryList::~CFactoryList( void )
  30. {
  31. CFactoryList ** m_nextp = &CFactoryList::_head;
  32.  
  33. for( ; *m_nextp ; m_nextp = &(*m_nextp)->m_next )
  34. if( *m_nextp == this )
  35. {
  36. *m_nextp = (*m_nextp)->m_next;
  37. break;
  38. }
  39. }
  40. }

参考:

  1. Why does C++ not have reflection?
  2. How can I add reflection to a C++ application?
  3. https://my.oschina.net/u/1450061/blog/204563
  4. https://my.oschina.net/u/1450061/blog/204608

  5. https://my.oschina.net/u/1450061/blog/204564

  6. http://m.blog.csdn.net/article/details?id=9254239

  7. http://blog.csdn.net/dengyunze/article/details/763558

  8. http://www.ithao123.cn/content-9688046.html

C语言如何开发简单的插件的更多相关文章

  1. 用GO语言开发editplus编辑器插件(附源码)

    我要开发的插件功能极为简单,就是对用户选中的内容进行base64编码或解密工作. 其中所涉及的技术部分主要是GO语言程序开发和editplus插件配置的部分,首先我们来看一下GO语言代码的写法,如下: ...

  2. [Songqw.Net 基础]WPF实现简单的插件化开发

    原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...

  3. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  4. Sublime Text 3前端开发常用优秀插件介绍

    . 首页 博客园 联系我 前言:关于Sublime Text 3. Package Control插件管理. Package Control使用方法/安装Emmet插件. Emmet插件. JsFor ...

  5. 在NPAPI开发火狐浏览器插件在NPAPI插件

    1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...

  6. VS简单注释插件——VS插件开发续

    VS简单注释插件——VS插件开发续 前些时候,我写过一篇<VS版权信息插件——初试VS插件开发小记>分享过一个用于添加注释信息的插件,但那个插件有几个问题: 不能添加带块注释(/**/), ...

  7. 如何开发一个 PyCharm 插件

    PyCharm 是很多 Python 开发者优先选择的 IDE,功能强大,跨平台,提供免费社区版,非常良心.如果你想自己给PyCharm添加一些功能怎么办呢?有两个办法: 通过提需求实现,到 JetB ...

  8. C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...

  9. 如何开发一个Jquery插件

    Jquery有两种开发插件的方法: 1.jquery.fn.extend(object); 2.jquery.extend(object); 第一种方法是给Jquery对象添加方法,jquery.fn ...

随机推荐

  1. ASP.NET知识总结(4.请求管道中的19个事件)

    (1)BeginRequest: 开始处理请求 (2)AuthenticateRequest授权验证请求,获取用户授权信息 (3):PostAuthenticateRequest获取成功 (4): A ...

  2. 浅析session&cookie

    session&cookie没有出现的黑暗时代 大家都知道,HTTP协议是一种无状态的协议,本次请求下一次请求没有任何的关联,所有没有办法直接用http协议来记住用户的信息,试想一向,每一次点 ...

  3. 逻辑回归(Logistic Regression)

    转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 本文主要讲解分类问题中的逻辑回归.逻辑回归是一个二分类问题. 二分类问题 二分类问题是指预测的y值只有两个 ...

  4. linux 学习 day1

  5. 如何自定义jupyter notebook的主题

    临时性的改变一个jupyter的主题 参考这个实现,只要在notebook里运行这段代码就行了,能让所有的cell都能够显示黑色背景 一个更为完备的工具 参考这个方案: 安装jupyter-theme ...

  6. 廖雪峰js教程笔记14 file文件操作

    在HTML表单中,可以上传文件的唯一控件就是<input type="file">. 注意:当一个表单包含<input type="file" ...

  7. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  8. 《Invert》开发日志04:工具、资源和服务

    这篇记录一下<Invert>用到的工具.资源和服务.秉承两个原则:一,绝不侵犯版权:二,尽量节省开支. 首先是工具.游戏引擎使用免费的Unity个人版: 编码IDE使用免费的VisualS ...

  9. enumerate()

    今天我们学一个单词 enumerate 后面加个括号 他就不是单词了,那是什么呢 来看一下 enumerate() a = ('htc', 'oppo', 'vivo', 'huawei', 'mi' ...

  10. BZOJ 1246 & 有点不一样的概率DP

    题意: 题意够坑的啊... 一个色子有n个面,第k次掷出一个加上这个k.求掷出所有面的期望值. 我一直以为值是色子面上的... 那么问题来了在色子面上怎么做...n还是1w级别... SOL: 对着理 ...