2023年Linu插件框架实验报告_第1页
2023年Linu插件框架实验报告_第2页
2023年Linu插件框架实验报告_第3页
2023年Linu插件框架实验报告_第4页
2023年Linu插件框架实验报告_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

孑叙技大孽

实验报告

学生姓名:学号:指导教师:

实验地点:A2-412实验时间:2023.01.04

一、实验室名称:

Linux环境高级编程实验室

二、实验项目名称:

插件框架实验

三、实验学时:

4学时

四、实验目的:

学习和实践插件框架的开发。理解插件的工作原理,为进一步开

发高可用,高复杂度的插件打下基础。

五、实验内容:

1、使用动态链接库实现打印功能:

开发一个程序,向屏幕打印“HelloWorld”;在不重新编译链接原程

序的前提下,将打印的文字改为"HelloChina”。

2、使用动态链接库实现自定义打印功能:

同时要打印“He11oWor1d”,打印“HelloChina”,甚至同时

打印未来才会增长的其他打印信息,打印信息的链接库放在一个固定

目录中,遍历这个目录,获取所有动态链接库。

打印未来的这些信息,也不能重新编译链接原程序。

3、

1)通过命令行方式:./a.outhelp,输出所有插件实现的功能ID,

以及该功能ID相应的功能描述。

2)通过命令行方式:./a.outFuncID,调用品体打印功能(每个插

件导出GetID接口)。

4、将插件导出的Print.GetID、Help三个函数放在一个类中,

主程序需要使用多个容器分别保存这些函数地址,让插件外部获取该

类的对象。

综合练习:实现一个软件系统,该系统可对文献进行记录分析。究竟

对文献进行什么样的记录分析,最终用户自己也不是很清楚,目前只

知道需要记录文献的行数。也就是说,本软件系统将会随时面临,增

长文献记录新功能的难题。请结合本实验内容,设计并实现这样一个

面向文献记录功能的插件系统。(需要实现的插件涉及:记录某个文

献的行数,记录某个文献的字节数)

六、实验环节:

程序1:

A.h:

extern"c"voidf();

a2.cpp:

#include<iostream>

#inc1ude"a.h”

usingnamespacestd;

voidf()

cout«"hello,China!n«endl;

}

Al.cpp:

#include<iostream>

#include"a.hH

usingnamespacestd;

voidf()

(

cout«"Hello,Wordn«end1;

}

Main.cpp:

#includeHa.h"

#include<d1fcn.h>

#include<iostream>

usingnamespacestd;

intmain()

void*handle=dlopen(n./libtest.so",RTLD_LAZY)

if(0==handle)

(

ocout«"dlopenerrorn<<endl;

urn0;

)

typedefvoid(*Fun)();

Funf1=(Fun)dlsym(hand1e,nfn);

if(0二二fl)

{

3cout<<"f1error"«end1;

®char*str=dlerror();

cout«str«end1;

)

(*fl)();

d1c1ose(handle);

return0;

程序运营结果如图1所示:

ianTanggui:-/test/test4/pTugl*q++-fpic-shared-olibtest.soal.cpp

root@BianTanggui:~/test/test4/plugl#Is

al.cppa2.cppa.hmain.cpp

root@BianTanggui:~/test/7plugl*g++-otestlmain.cpp-Idl

root@BianTanggui:-/test/test4/plugl*./testl

dello,word

^oot@BianTanggui:-/test/test4/plugl#g++-fpic-shared-olibtest.soa2.cpp

^oot@BianTanggui:~/test/test4/plugl*./testl

hello,china!"

「ccr@R~iKHT;incniZ:〜/T”T/r”T4/nl#■________________________________________________

图1:字符的变换

程序2:

Al.cpp:

#inc1ude<iostream>

usingnamespacestd;

extern”C"voidf()

(

cout<<"He11oworldn«endl;

)

A2.cpp:

#include<iostream>

usingnamespacestd;

extern"C”voidf()

{

cout«HHello,china!M«endl;

)

A3.cpp:

#include<iostream>

usingnamespacestd;

extemHC"voidf()

6cout«nHel1o333”<<endl;

A4,cpp:

#inc1ude<iostream>

usingnamespacestd;

extern"C"voidf()

(

coutvv“Hello4444n«endl;

)

Test2.cpp:

#include<d1fcn.h>

#include<iostream>

#include<dirent.h>

#inc1ude<stdio.h>

#include<string.h>

0

usingnamespacestd;

intmain()

(

charpath[260];

,DIR*dir;

。structdirent*ptr;

r=opendir('7root/test/tes14/p1ug2/plugin/");

owhile((ptr=readdir(dir))!=NULL)

b{

“f((strcmp(ptr->d_name,"..")==0)|I(strcmp(pt

r->d_name,M.n)==0))

continue;

oosprintf(path,17root/test/test4/plug2/p1ugin/%s",ptr—>d_n

ame);

。void*handle=dlopen(path,RTLD_LAZY);

if(0==hand1e)

6(

。cout«”d1openerroru«endl;

return0;

。)

typedefvoid(*Fun)();

Funpf=(Fun)d1sym(handle,"f1);

if(0==pf)

{

cout«”pferror'1«end1;

。0char*str=d1error();

scout«str<<endl;

oreturn0;

t>}o

(*pf)0;

d1close(hand1e);

®closedir(dir);

程序运营结果如图2所示:

root@BianTanggui:-/test/test4/plug2#./test

Hello333

Helloworld

Hello,china!

Hello4444

]OQt@BiarTariqgu~i:〜八est/t:est4/pliiq2#Is./plugin

3T72彳"

root@BianTanggui?-/1est/tes14/p1ug2#!

图2:插件的遍历

程序3:

al.cpp:

#include<iostream>

usingnamespacestd;

constintFUNC_ID=1;

extern"C"voidf()

cout«"HelloWorld!"«end1;

extern"C"voidHelp()

cout«"FunctionID"<<FUNCJD«":Thisfunct

ionprintsHelloWorld."«endl;

a2.cpp:

#inc1ude<iostream>

usingnamespacestd;

constintFUNCJD=2;

externnCnvoidf()

{

cout«"HelloChina!u«end1;

}

extern"C"voidHelp()

(

cout«HFunctionIDn«FUNC」D«”Thisfunc

tionprintshe1iochina."<<endl;

)

CPluginEnumerator.cpp

#include'CPluginEnumerator.h"

#inc1ude<dirent.h>

#include<string.h>

#include<iostream>

#include<stdio.h>

CPIuginEnumerator::CPluginEnumerator()

CPluginEnumerator::〜CPluginEnumerator()

boo1CPluginEnumerator::GetPluginNames(vector<string>&vstr

PluginNames)

(

DIR*dir=opendir(Vroot/test/tes14/p1ug3/plugin");

if(dir==0)

®returnfalse;

for(;;)

(

。structdirent*ptr=readdir(dir);

oif(ptr==0)

abreak;

时f((strcmp(ptr->d_name,"==0)||(strcmp(ptr->d_name,”・.“)二

=0))

^continue;

,charpath[260];

®sprintf(path,M/root/test/test4/Plug3/plugin/%sn,ptr->d_n

ame);

vstrPluginNames.push_back(path);

)

closedir(dir);

^returntrue;

Test,cpp:

#include<d1fcn.h>

#include<iostream>

#inc1ude"CPIuginEnumerator.h"

#include<string.h>

#include<stdio.h>

usingnamespacestd;

intmain(intargc,char**argv)

(

ocharpath[260];

if(argc!=2)

return0;

if(strcmp(argv[l],nheIp")==0)

(

wector<string>vstrPluginNames;

。CP1uginEnumeratorenumerator;

if(!enumerator.GetP1uginNames(vstrP1uginNames))

(

^cout<<"GetPluginNameserror"«endl;

^return0;

for(inti=0;i<vstrPluginNames.size();i++)

。voidhandle=dlopen(vstrP1uginNames[i].c_str(),RTL

D_LAZY);

eif(hand1e==0)

001

bcout«”d1openerror”«endl;

。return0;

)

001ypedefvoid(*FUNC_HELP)();

FUNC_HELPdl_he1p=(FUNC.HELP)dlsym(handie,”

Help");

b“f(d1_heIp==0)

6{

gcout«"disymerror11<<endi;

•«>return0;

。(dl_help)();

odlclose(hand1e);

。}

}

®elseif(strcmp(argv[l],"1n)==0)

(

osprintf(path,n/root/test/test4/p1ug3/plugin/%sM,"a1.soH);

void*handie=dlopen(path,RTLD_LAZY);

<>if(handle==0)

°(

。。cout«"d1openerror"<<end1;

8,return0;

}

»typedefvoid(*FUNC_PRINT)();

FUNC_PRINTdl_print=(FUNC_PRINT)dlsym(handle,"f");

,if(dl_print==0)

00|

8cout«"d1symerrorM«end1;

。return0;

。(d1_print)();

bdlclose(handle);

照1seif(strcmp(argv[l],n2")==0)//得到第二个func的参数

6{

8sprintf(path,'7root/test/test4/plug3/plugin/%s","a2.so”);

8Void*handle=dlopen(path,RTLD_LAZY);

«>if(handle==0)

{

cout<<"dlopenerrorn<<end1;

。oreturn0;

}

“ypedefvoid(*FUNC_PRINT)();

。FUNC_PRINTdl_print=(FUNC_PRINT)dlsym(hand1e,"f

");

oif(d1_ptint==0)

g

gcout<<"d1symerror"«end1;

。。return0;

0

(dl_print)();

ad1close(handle);

return0;

程序运营结果如图3所示:

root@BianTanggui:~/test/test4/plug3#Is

CPluginEnumerator.cppCPluginEnumerator.htest.cpp

root@BianTanggui:~/test/test4/plug3#./testhelp

FunctionID1:ThisfunctionprintsHelloworld.

FunctionID2Thisfunctionprintshellochina.

root@BianTanggui:~/test/test4/plugB#./test1

Helloworld!

root@BianTanggui:~/test/test4/plug3#./test2

Hellochina!

root@BianTanggui:~/test/test4/plug3#|

图3:插件输出

程序4:

CPIuginEnumerator.h:

#ifndefCPLUGINENUMERATORS

#defineCPLUGINENUMERATORII

#inc1ude<vector>

#include<string>

usingnamespacestd;

c1assCP1uginEnumerator

(

public:

CPluginEnumerator();

virtua1~CP1uginEnumerator();

boolGetPluginNames(vector<string>&vstrPluginNames);

};

#endif

CPluginEnumerator.cpp:

#include"CPIuginEnumerator.hn

#inc1ude<dirent.h>

#include<string.h>

CPluginEnumerator::CPluginEnumerator()

(

)

CPluginEnumerator::~CP1uginEnumerator()

boolCPluginEnumerator::GetPluginNames(vector<string>&vst

rPluginNames)

DIR*dir=opendir("./p1ugin");

if(dir==0)

returnfalse;

for(;;)

(

structdirent*pentry=readdir(dir);

Af(pentry==0)

。break;

if(strcmp(pentry->d_name,".")==0)

continue;

if(strcmp(pentry->d_name,==0)

3continue;

6Stringstr=/plugin/',;

str+=pentry->d_name;

wstrPluginNames.push_back(str);

)

closedir(dir);

returntrue;

CPluginController.h

#ifndefCPLUGINCONTROLLER_H

#defineCPLUGINCONTROLLER_H

#inc1ude<vector>

classIPrintPlugin;

classCPluginContro1ler

(

public:

0cpiuginController(void);

wirtual〜CP1uginControl1er(void);

boo1InitializeContro11er(void);

boolUninitializeController(void);

boo1ProcessHelp(void);

boolProcessRequest(intFunctionID);

private:

ostd::vector<void*>m_vhForPlugin;

std::vector<IPrintPlugin*>m_vpPlugin;

);

#endif

CPluginControl1er.cpp

include”CPluginControlier,hH

#include"CPluginEnumerator.h”

#includenIPrintPlugin.h"

#includend1fcn.h"

CP1uginController::CPluginController(void)

(

}

CP1uginControiler::〜CPluginController(void)

boo1CPluginContro11er::InitializeControlier(void)

(

ostd::vector<std::string>vstrPluginNames;

CPluginEnumeratorenumerator;

if(!enumerator.GetPluginNames(vstrP1uginNames))

returnfalse;

ofor(unsignedinti=0;i<vstrPluginNames.size();i++)

°(

“ypedefint(*PLUGIN,CREATE)(IPrintPlugin**);

>PLUGIN_CREATECreateProc;

IPrintPlugin*pPlugin=NULL;

。void*hinstLib=dlopen(vstrPluginNamesEi],c_str(),RTLD_L

AZY);

»if(hinstLib!=NULL)

。®m_vhForPlugin.push_back(hinstLib);

oCreateProc=(PLUGIN_CREATE)disym(hinstLib,"CreateObj");

。。if(NULL!=CreateProc)

®®(CreateProc)(&pPlugin);

。“f(pP1ugin!=NULL)

a。m_vpP1ugin.push_back(pP1ugin);

eb}

°)

°)

°)

returntrue;

)

boolCPluginController::ProcessRequest(intFunctionII

(

<>for(unsignedinti=0;i<m_vpPlugin.size();i++)

s(

if(m_vpPlugin[i]—>GetID()==FunctionID)

«m_vpPlugin[i]->Print();

®break;

°)

®returntrue;

}

boo1CPluginControlier::ProcessHe1p(void)

(

std::vector<std::string>vstrPluginNames;

CPluginEnumeratorenumerator;

<>if(!enumerator.GetPluginNames(vstrP1uginNames))

“returnfa1se;

<>for(unsignedinti=0;i<vstrPluginNames.size();i++)

(

。typedefint(*PLUGIN_CREATE)(IPrintPlugin**);

。PLUGIN_CREATECreateProc;

。IPrintPlugin*pPlugin=NULL;

8Void*hinstLib=dlopen(vstrPluginNames[i].c_str(),RTLD_LAZ

Y);

if(hinstLib!=NULL)

00{

«CreateProc=(PLUGIN_CREATE)dlsym(hinstLib,"CreateObj

qf(NULL!二CreateProc)

。(CreateProc)(&pPlugin);

3qf(pPlugin!=NULL)

00{

8叩Plugin->He1p();

00}

8d1c1ose(hinstLib);

)

0)

returntrue;

)

boolCPluginControiler::UninitializeContro1ler()

(

for(unsignedinti=0;i<m_vhForP1ugin.size();i++)

。(

o(i1close(m_vhForPlugin[i]);

)

oreturntrue;

}

IPrintPlugin・h

#pragmaonee

classIPrintPlugin

(

public:

IPrintP1ugin();

®virtual〜IPrintPlugin();

virtualvoidHe1p()=0;

virtualvoidPrint()=0;

irtualintGetID()=0;

};

IPrintPlugin.cpp

#inc1udenIPrintPlugin.h”

IPrintPlugin::IPrintPlugin()

IPrintPlugin::〜IPrintPlugin()

(

}

Function.cpp

#include<iostream>

#inc1udenIPrintP1ugin.h”

usingnamespacestd;

constintFUNC_ID=1;

classCPrintPlugin:publicIPrintP1ugin

(

public:

CPrintPlugin()

。}

virtual~CPrintPlugin()

(

。virtualvoidPrint()

°(

“cout«"HelloWorld!"«endl;

°)

®virtualvoidHelp()

(

。cout<<"FunctionID"«FUNC_ID«":Thisfunctionw

i11printhelloworId."<<endl;

°)

ovirtualintGetID(void)

oreturnFUNC_ID;

);

extern"CnvoidCreate0bj(IPrintPlugin**ppP1ugin)

(

^staticCPrintPluginplugin;

®*ppPlugin=&plugin;

)

functionl.cpp

#include<iostream>

#inc1udenIPrintPlugin.h"

usingnamespacestd;

constintFUNC」D=2;

classCPrintPlugin:pub1icIPrintPlugin

(

public:

CPrintP1ugin()

0(

evirtua1~CPr血Plugin()

°)

virtualvoidPrint()

8C0Ut«HelloChina!n<<endl;

virtualvoidHelp()

°{

oocout«"FunctionID"«FUNC_ID«*:Thisfunctionwi11pr

inthellochina."<<end1;

)

virtua1intGetID(void)

(

sreturnFUNC_ID;

。}

};

externvoidCreateObj(IPrintPlugin**ppP1ugin)

(

staticCPrintPluginp1ugin;

,*ppP1ugin=&p1ugin;

)

Main.cpp

#inc1ude<iostream>

#include°CP1uginController.h"

#include<string.h>

#include<stdlib.h>

usingnamespacestd;

intmain(intargc,char**argv)

“f(argc!=2)

。(

cout<<"Parameterserroru«end1;

8return0;

)

if(strcmp(argv[1],"helpn)==0)

。{

。CPluginContro1lerpc;

pc.ProcessHelp();

Breturn0;

intFunctionID=atoi(argv[1]);

。CP1uginContro11erpc;

叩c.Initia1izeContro11er();

叩c・ProcessRequest(FunctionlD);

pc.UninitializeContro11er();

oreturn0;

程序运营结果如图4所示:

rooti3BianTanggui:~/test/test4/plug4#g++-fpic-shared-oa2.sofunctionl.cppIP

rintPlugin.cpp

rootQBianTanggui:~/test/test4/plug4#g++-fpic-shared-oal.sofunction.cppIPr

intPlugin.cpp

rootianTanggui:~/test/test4/plug4#Is

al.soCPluginEnumerator.cppIPrintPlugin.cppplug

a2.soCPluginEnumerator.hIPrintPlugin.h

CPluginController.cppfunctionl.cppmain

CPluginController.hfunction.cppmain.cpp

root@BianTanggui:~/test/test4/plug4#g++-omainmain.cppCPluginController.cpp

CPluginEnumerator.cpp-Idl

rootQBianTanggui:c,/test/test4/plug4#rm./plugin/*

root@BianTanggui:~/test/test4/plug4#mva*./plugin

rootQBianTanggui:~/test/test4/plug4#./mainhelp

FunctionID1:Thisfunctionwillprinthelloworld.

FunctionID2:Thisfunctionujillprinthellochina.

root@BianTanggui:~/test/test4/plug4#./main1

HelloHorld!

root@BianTanggui:~/test/test4/plug4#./main2

HelloChina!

rootOBianTanggui:~/test/test4/plug4#_

图4:插件获取类对象

综合练习:

CPluginController.cpp

#include”CPluginContro1ler.h"

#inc1udeHCPluginEnumerator.hn

#includenIPrintPlugin.h'1

#inc1ude"d1fcn.h"

#include<string.h>

CPluginControl1er::CPluginContro11er(void)

CPIuginController::~CPluginControlIer(void)

boolCPluginController::InitializeControl1er(void)

td::vector<std::string>vstrPluginNames;

CPIuginEnumeratorenumerator;

^>if(!enumerator.GetPluginNames(vstrP1uginNames))

turnfalse;

ofbr(unsignedinti=0;i<vstrPluginNames.size();i++)

°(

typedefint(*PLUGIN_CREATE)(IPrintPlugin**);

^PLUGIN_CREATECreateProc;

8IPrintP1ugin*pP1ugin=NULL;

8Void*hinstLib=dlopen(vstrPluginNames[i].c_str(),RTLD

LAZY);

^if(hinstLib!=NULL)

。。m—vhForPlugin.push_back(hinstLib);

goCreateProc=(PLUGIN_CREATE)dlsym(hinstLib,"CreateObj”);

oooif(NULL!=CreateProc)

6{

g6(CreateProc)(&pP1ugin);

“f(pPlugin!=NULL)

8I

ggm_vpPlugin.push_back(pPlugin);

°}

bbJ

)

。「eturntrue;

)

boolCP1uginContro1ler::ProcessRequest(intFunctionlD)

(

for(unsignedinti=0;i<m_vpPlugin.size();i++)

。{

8if(m_vpP1ugin[i]—>GetID()==FunctionID)

{

。m_vpPlugin[i]->Print();

。break;

)

returntrue;

)

boo1CPluginContro1ler::ProcessHe1p(void)

(

ostd::vector<std::string>vstrP1uginNames;

《PluginEnumeratorenumerator;

if(!enumerator.GetPluginNames(vstrP1uginNames))

greturnfa1se;

for(unsignedinti=0;i<vstrPluginNames.size();i++)

(

typedefint(*PLUGIN_CREATE)(IPrintPlugin**);

PLUGIN_CREATECreateProc;

IPrintPlugin*pPlugin=NULL;

ovoid*hinstLib=dlopen(vstrP1uginNames[i].c_str(),

RTLD_LAZY);

。if(hinstLib!=NULL)

。CreateProc=(PLUGIN_CREATE)d1sym(hinstLib,"Crea

teObj");

。oif(NULL!=CreateProc)

oe{

8(CreateProc)(&pPlugin);

。qf(pPlugin!=NULL)

00{

ooooopPlugin->Help();

00}

。o(i1close(hinstLib);

°)

”eturntrue;

}

boo1CPluginController::IfProcess(char*Function)〃判断插件是否存在

(

^unsignedinti;

。for(i=0;i<m_vpP1ugin.size();i++)

°{

if(strcmp(Function,m_vpPlugin[i]—>GetName())==0)

{

break;

00}

°);

if(i<m_vpP1ugin.size())〃插件存在

°(

returntrue;

}

®else

(

”eturnfa1se;

boolCPIuginControl1er::ProcessFunction(char*Function,ch

ar*Document)//执行插件功能

for(unsignedinti=0;i<m_vpPlugin.size();i++)

,if(strcmp(Function,m_vpPlugin[i]->GetName())==0)

m_vpP1ugin[i]->Fun(Document);〃插件功能

obreak;

)

}

retumtrue;

)

boolCPluginContro11er::UninitializeControl1er()

(

»for(unsignedinti=0;i<m_vhForPlugin.size();i++)

°(

dlclose(m_vhForPlugin[i]);

)

»returntrue;

)

CPIuginControl1er.h

#ifndefCPLUGINCONTROLLER_H

#defineCPLUGINCONTROLLER_H

#inc1ude<vector>

classIPrintP1ugin;

classCPluginContro11er

(

pub1ic:

CPluginContro11er(void);

virtua1~CP1uginController(void);

0

boo1InitializeContro1ler(void);

oolUninitializeController(void);

boolProcessHelp(void);

®boo1ProcessRequest(intFunctionID);

boolIfProcess(char*Function);

boolProcessFunction(char*Function,char*Document);

private:

«>std::vector<void*>m_vhForPlugin;

i>std::vector<IPrintPlugin*>m_vpPlugin;

);

#endif

CP1uginEnumerator.h

#ifndefCPLUGINENUMERATOR_H

#defineCPLUGINENUMERAT0R_H

#include<vector>

#include<string>

usingnamespacestd;

c1assCPluginEnumerator

(

public:

CPluginEnumerator();

virtua1-CPluginEnumerator();

boolGetPluginNames(vector<string>&vstrPluginName

s);

);

#endif

CPluginEnumerator.cpp

#inc1udenCPluginEnumerator.h"

#inelude<dirent.h>

#include<string.h>

CPluginEnumerator::CPluginEnumerator()

(

)

CPluginEnumerator::-CPluginEnumerator()

boo1CPluginEnumerator::GetP1uginNames(vector<string>&

vstrPluginNames)

DIR*dir=opendir(M./pluginn);

if(dir==0)

returnfaIse;

for(;;)

{

structdirent*pentry=readdir(dir);

if(pentry==0)

。break;

«»if(strcmp(pentry—>d_name,==0)

continue;

。if(strcmp(pentry->d_name,.")==0)

continue;

ostringstr="・/p1ugin/";

。str+二pentry->d_name;

vstrPluginNames.push_back(str);

)

closedir(dir);

returntrue;

)

Main.cpp

#include<iostream>

#inelude”CPluginContro1ler.h”

#include<string.h>

#include<stdlib.h>

usingnamespacestd;

intmain(intargc,char**argv)

(

if(argc==2)

。(

if(strcmp(argv[1],"he1p")==0)//帮助功能

eCPluginContro11erpc;

8Pc.ProcessHeip();

。®return0;

8}

<>else

3“ntFunctionlD=atoi(argv[l]);

(PluginContro11erpc;

pc.Initia1izeControIler();

pc.ProcessRequest(FunctionlD);

opc.Uninitia1izeController();

return0;

°)

elseif(argc==3)

°{

。CPIuginControllerpc;

。char*Function=argv[l];

/AFunction+=”.so”;

char*Document=argv[2];〃操作的文献名

pc.Initia1izeControiler();

。if(pc.IfProcess(Function)==fa1se)//判断插件是否存在

(

ocout<<"Nothisplugin!M<<endl;

)

«»else//

(

pc.ProcessFunction(Function,Document);

6);

。pc.UninitializeController();

areturn0;

else

{

cout«"Parameterserror”<<end1;

3return0;

}a

插件:

IPrintPIugin.cpp

#include"IPrintP1ugin.h"

IPrintP1ugin::IPrintP1ugin()

IPrintPlugin::〜IPrintPlugin()

{

)

IPrintPlugin.h

#pragmaonce

classIPrintPlugin

(

publie:

®DPrintPlugin();

virtual~IPrintPlugin();

virtualvoidHeip()二0;

ovirtualvoidPrint()=0;

。virtua1intGetID()二0;

virtualchar*GetName()=0;//添加部分

ovirtua1voidFun(char*)=0;

);

Line.cpp

#inc1ude<iostream>

include”IPrintPlugin.h"

#include<unistd.h>//read(fi1e)

#inc1ude<fcntl.h>

#include<string.h>

usingnamespacestd;

constintFUNC」D=3;

charFUNC_NAME[]="s1";//statisticsline!

classCPrintPlugin:pub1icIPrintPlugin

(

publie:

oCPrintPlugin()

)

virtua1〜CPrintPlugin()

(

virtua1voidPrint()

b(

cout«nStatisticsthedocumentline!"<<endl;

6)

*irtualvoidHelp()

°{

oocOUt«nFunctionIDu«FUNC_ID«”:Thisfunctionwil

1statisticsthedocument1ine.”«end1;

}

wirtualintGetID(void)

°{

^returnFUNC_ID;

0)

ovirtualchar*GetName()

{

oreturnFUNC_NAME;

)

wirtualvoidFun(char*Document)

°{

。intfp;

chartemp;

Mongnum=0;〃记录

,//openfile

。if((fp=open(Document,O_RDONLY))=-l)

8ocoutvV"Cannotopen:n<<Document<<endl;

。return;

while(read(fp,&temp,1))

if(temp=='\n')

bbb

。num++;

°}

。};

close(fp);

cout<<Document<<"linesis:n«num«end1;

。};

);

extern"C”voidCreateObj(IPrintPlugin**ppPlugin)

(

staticCPrintPluginp1ugin;

*ppPlugin=&plugin;

)

Words.cpp

#include<iostream>

#includeMIPrintPlugin.hn

#include<unist

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论