日期:2014-05-16 浏览次数:20915 次
//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;
}
//主文件结束