版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
孑叙技大孽
实验报告
学生姓名:学号:指导教师:
实验地点: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级上册数学(人教版)3.两位数连加、连减和加减混合运算练习-1教学设计
- 《火车过桥》(教案)四年级上册奥数人教版
- 2024年化妆品品牌建设合作
- 大班安全教案《水的安全》
- (2024版)高端装备制造业产业链协同创新协议
- 建筑行业绿色节能改造方案
- 生态农业水稻种植技术方案
- 酒店给排水系统施工组织设计方案
- 公共交通系统安全演练方案
- 2024化工原料搬运吊装安全合同
- 马戏团活动方案
- 政府会计童光辉课后习题答案
- 当代大学生幸福感课件
- 张剑简要的创业计划书
- 钢筋工程量计算规则
- 2024年江西赣州城投工程管理有限公司招聘笔试参考题库含答案解析
- 五年级科学 《光的反射》 一等奖
- 人力资源各维度分析报告
- 蝴蝶效应教学课件
- 中医启蒙知识讲座
- 健康科技行业人员培训脑机接口与康复技术
评论
0/150
提交评论