日期:2014-05-16 浏览次数:20718 次
//VDS_core.h #ifndef VDS_CORE_H_ #define VDS_CORE_H_ // 定义强制C类型以回避C++命名规范,这样我们就可以定义dlsym() #ifdef __cplusplus extern "C" { #endif class CPlugMain { public: virtual int Action() = 0; }; // 下面是Plugin的通用函数,每个Plugin都会重载这个函数,主程序将创建唯一的子进程 extern CPlugMain *CreatePlug(); typedef CPlugMain * (*CREATEPLUG_PROC)(); #ifdef __cplusplus } #endif //#define cplusplus #endif /* VDS_CORE_H_ */
//VDS_core.cpp #include <stdio.h> #include<stdlib.h> #include <dlfcn.h> #include "VDS_core.h" //下面将定义固定的Plugin名称,读者可以自行定义如同Windows注册表那样的Plugin注册系统 #define NUM_PLUGINS 2 char * szPlugins[]={"./plugin1.so","./plugin2.so"}; int main(int argc, char ** argv) { CREATEPLUG_PROC createproc[NUM_PLUGINS]; CPlugMain * pPlugins[NUM_PLUGINS]; void * handle[NUM_PLUGINS]; char * error; int i; //加载所有Plugin for(i=0;i<NUM_PLUGINS;i++){ printf("加载plugin%s.\n",szPlugins[i]); //加载Plugin动态链接库 if(NULL==(handle[i]=dlopen(szPlugins[i],RTLD_LAZY))){ handle[i]=NULL; printf("dlopenerror(%s)\n",szPlugins[i]); }else{ //取得CreatePlug的地址 createproc[i]=(CREATEPLUG_PROC)dlsym(handle[i],"CreatePlug"); if((error=dlerror())!=NULL){ dlclose(handle[i]); handle[i]=NULL; printf("dlsymerror(%s)\n",szPlugins[i]); }else{ //创建plugin进程 pPlugins[i]=createproc[i](); } } } //执行plugin的动作 printf("正在运行plugin..\n"); for(i=0;i<NUM_PLUGINS;i++){ if(handle[i]!=NULL){ pPlugins[i]->Action(); } } //关闭plugin for(i=0;i<NUM_PLUGINS;i++){ if(handle[i]!=NULL){ dlclose(handle[i]); handle[i]=NULL; } } return 0; } //主文件结束