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