快速业务通道

linux C /C 动态链接库使用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-24
age) : BasePeople(name,age)
{
cout << "student''s constructor invoked" << endl;
}

virtual ~student(){
cout << "student''s de-constructor invoked" << endl;
}

virtual void speak(){
int i = 0;
while(i < 10){
cout << "I am a student, my name is " << this->name_ << ", and my age is " << this->age_ << endl;
sleep(1);
i;
}
}
};

// 动态库文件libstudent.so中包含有在base.h中申明的两个extern "C" 方法
BasePeople* create_BasePeople(const string & name, const int age){
//student* sd = new student(name,age);
return new student(name,age);
} void delete_BasePeople(BasePeople * pp){
if(pp)
delete pp;
}

3)teacher.cpp,该文件和student.cpp一样,只是会生成libteacher.so动态库.
// teacher.cpp
#include "base.h" class teacher : public BasePeople{
public:
teacher(const string & name, const int age) : BasePeople(name,age)
{
cout << "teacher''s constructor invoked" << endl;
}

virtual ~teacher(){
cout << "teacher''s de-constructor invoked" << endl;
}

virtual void speak(){
int i = 0;
while(i < 10){
cout << "I am a teacher, my name is " << this->name_ << ", and my age is " << this->age_ << endl;
sleep(1);
i;
}
}
}; BasePeople* create_BasePeople(const string & name, const int age){
//teacher* sd = new teacher(name,age);
return new teacher(name,age);
} void delete_BasePeople(BasePeople * pp){
if(pp)
Empire CMS,phome.net

delete pp;
}

4)callPlugin.cpp调用类的实现
// callPlugin.cpp
#include "base.h"
#include <dlfcn.h>
#include <pthread.h>

class callPlugin{
typedef BasePeople* ObjectPtr;
typedef ObjectPtr (*createObjectPtr)(const string &, const int);
typedef void (*deleteObjectPtr)(ObjectPtr); public:
callPlugin(const string & soPath, const int openMode = RTLD_LAZY) : soPath_(soPath), openMode_(openMode){
cout << "callPlugin constructor invoked!" << endl;
}

~callPlugin(){
cout << "callPlugin de-constructor invoked!" << endl;
}

int excute(){
void * pluginHandler = openPlugin();
if(pluginHandler){
// 得到create_BasePeople方法的指针
createObjectPtr createFunc = (createObjectPtr) dlsym(pluginHandler,__CREATE_OBJECT__.c_str());
ObjectPtr people = NULL;
if(createFunc){
people = createFunc("luoxiaoyi",23);
people->speak();
people->test();
}else{
cout << "callPlugin::excute() createFunc error :" << dlerror() << endl;
}

// 得到delete_BasePeople方法的指针
deleteObjectPtr deleteFunc = (deleteObjectPtr) dlsym(pluginHandler,__DELETE_OBJECT__.c_str());

if(deleteFunc){
deleteFunc(people);
}else{
cout << "callPlugin::excute() deleteFunc error :" << dlerror() << endl;
}

// 关闭pluginHandler,回收资源
dlclose(pluginHandle

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号