版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子科技大学实验报告学生姓名:学号:指导教师:实验地点:A2-412实验时间:2023.01.04一、实验室名称:Linux环境高级编程实验室二、实验项目名称:插件框架实验三、实验学时:4学时四、实验目的:学习和实践插件框架的开发。理解插件的工作原理,为进一步开发高可用,高复杂度的插件打下基础。五、实验内容:1、使用动态链接库实现打印功能:开发一个程序,向屏幕打印“HelloWorld”;在不重新编译链接原程序的前提下,将打印的文字改为“HelloChina”。2、使用动态链接库实现自定义打印功能:同时要打印“HelloWorld”,打印“HelloChina”,甚至同时打印未来才会增长的其他打印信息,打印信息的链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。打印未来的这些信息,也不能重新编译链接原程序。3、1)通过命令行方式:./a.outhelp,输出所有插件实现的功能ID,以及该功能ID相应的功能描述。2)通过命令行方式:./a.outFuncID,调用品体打印功能(每个插件导出GetID接口)。4、将插件导出的Print、GetID、Help三个函数放在一个类中,主程序需要使用多个容器分别保存这些函数地址,让插件外部获取该类的对象。综合练习:实现一个软件系统,该系统可对文献进行记录分析。究竟对文献进行什么样的记录分析,最终用户自己也不是很清楚,目前只知道需要记录文献的行数。也就是说,本软件系统将会随时面临,增长文献记录新功能的难题。请结合本实验内容,设计并实现这样一个面向文献记录功能的插件系统。(需要实现的插件涉及:记录某个文献的行数,记录某个文献的字节数)六、实验环节:程序1:h:extern"c"voidf();a2.cpp:#include<iostream>#include"a.h"usingnamespacestd;voidf(){cout<<"hello,China!"<<endl;}A1.cpp:#include<iostream>#include"a.h"usingnamespacestd;voidf(){cout<<"Hello,Word"<<endl;}Main.cpp:#include"a.h"#include<dlfcn.h>#include<iostream>usingnamespacestd;intmain(){void*handle=dlopen("./libtest.so",RTLD_LAZY);if(0==handle){ ﻩcout<<"dlopenerror"<<endl;ﻩﻩreturn0;}typedefvoid(*Fun)();Funf1=(Fun)dlsym(handle,"f");if(0==f1){ ﻩcout<<"f1error"<<endl;ﻩchar*str=dlerror(); cout<<str<<endl;} (*f1)();dlclose(handle);return0;}程序运营结果如图1所示:图1:字符的变换程序2:A1.cpp:#include<iostream>usingnamespacestd;extern"C"voidf(){ cout<<"Helloworld"<<endl;}A2.cpp:#include<iostream>usingnamespacestd;extern"C"voidf(){cout<<"Hello,china!"<<endl;}A3.cpp:#include<iostream>usingnamespacestd;extern"C"voidf(){ﻩcout<<"Hello333"<<endl;}A4.cpp:#include<iostream>usingnamespacestd;extern"C"voidf(){ cout<<"Hello4444"<<endl;}Test2.cpp:#include<dlfcn.h>#include<iostream>#include<dirent.h>#include<stdio.h>#include<string.h>ﻩusingnamespacestd; intmain(){ charpath[260];ﻩDIR*dir;ﻩstructdirent*ptr;ﻩdir=opendir("/root/test/test4/plug2/plugin/");ﻩwhile((ptr=readdir(dir))!=NULL)ﻩ{ ﻩif((strcmp(ptr->d_name,"..")==0)||(strcmp(ptr->d_name,".")==0))ﻩ { continue; ﻩ}ﻩﻩsprintf(path,"/root/test/test4/plug2/plugin/%s",ptr->d_name); ﻩ void*handle=dlopen(path,RTLD_LAZY); if(0==handle)ﻩ{ﻩ cout<<"dlopenerror"<<endl; return0;ﻩ} typedefvoid(*Fun)();ﻩ Funpf=(Fun)dlsym(handle,"f"); if(0==pf) {ﻩﻩ cout<<"pferror"<<endl;ﻩﻩchar*str=dlerror(); ﻩ cout<<str<<endl; ﻩreturn0;ﻩ}ﻩ (*pf)(); dlclose(handle); }ﻩclosedir(dir);}程序运营结果如图2所示:图2:插件的遍历程序3:a1.cpp:#include<iostream>usingnamespacestd;constintFUNC_ID=1;extern"C"voidf(){cout<<"HelloWorld!"<<endl;}extern"C"voidHelp(){cout<<"FunctionID"<<FUNC_ID<<":ThisfunctionprintsHelloWorld."<<endl;}a2.cpp:#include<iostream>usingnamespacestd;constintFUNC_ID=2;extern"C"voidf(){cout<<"HelloChina!"<<endl;}extern"C"voidHelp(){cout<<"FunctionID"<<FUNC_ID<<"Thisfunctionprintshellochina."<<endl;}CPluginEnumerator.cpp#include"CPluginEnumerator.h"#include<dirent.h>#include<string.h>#include<iostream>#include<stdio.h>CPluginEnumerator::CPluginEnumerator(){}CPluginEnumerator::~CPluginEnumerator(){}boolCPluginEnumerator::GetPluginNames(vector<string>&vstrPluginNames){DIR*dir=opendir("/root/test/test4/plug3/plugin");if(dir==0)ﻩﻩreturnfalse;for(;;){ ﻩstructdirent*ptr=readdir(dir); ﻩif(ptr==0)ﻩﻩ break;ﻩﻩif((strcmp(ptr->d_name,".")==0)||(strcmp(ptr->d_name,"..")==0)) ﻩﻩcontinue;ﻩ charpath[260]; ﻩsprintf(path,"/root/test/test4/plug3/plugin/%s",ptr->d_name); vstrPluginNames.push_back(path);} closedir(dir);ﻩreturntrue;}Test.cpp:#include<dlfcn.h>#include<iostream>#include"CPluginEnumerator.h"#include<string.h>#include<stdio.h>usingnamespacestd;intmain(intargc,char**argv){ﻩcharpath[260];if(argc!=2) return0;if(strcmp(argv[1],"help")==0){ ﻩvector<string>vstrPluginNames;ﻩ CPluginEnumeratorenumerator; if(!enumerator.GetPluginNames(vstrPluginNames)) { ﻩﻩcout<<"GetPluginNameserror"<<endl; ﻩﻩreturn0; } for(inti=0;i<vstrPluginNames.size();i++) { ﻩ void*handle=dlopen(vstrPluginNames[i].c_str(),RTLD_LAZY);ﻩ if(handle==0) ﻩﻩ{ ﻩ cout<<"dlopenerror"<<endl;ﻩ return0; } ﻩﻩtypedefvoid(*FUNC_HELP)(); ﻩFUNC_HELPdl_help=(FUNC_HELP)dlsym(handle,"Help");ﻩ ﻩif(dl_help==0) ﻩ {ﻩﻩ cout<<"dlsymerror"<<endl;ﻩ ﻩreturn0;ﻩﻩﻩ}ﻩ (dl_help)(); ﻩdlclose(handle); ﻩ} }ﻩelseif(strcmp(argv[1],"1")==0) { ﻩsprintf(path,"/root/test/test4/plug3/plugin/%s","a1.so");ﻩ void*handle=dlopen(path,RTLD_LAZY); ﻩif(handle==0) ﻩ{ﻩﻩ cout<<"dlopenerror"<<endl;ﻩﻩﻩreturn0; }ﻩ ﻩtypedefvoid(*FUNC_PRINT)(); FUNC_PRINTdl_print=(FUNC_PRINT)dlsym(handle,"f");ﻩ if(dl_print==0)ﻩﻩ{ﻩﻩ cout<<"dlsymerror"<<endl; ﻩ return0; ﻩ} ﻩ(dl_print)(); ﻩdlclose(handle);ﻩ}ﻩelseif(strcmp(argv[1],"2")==0)//得到第二个func的参数ﻩ{ﻩﻩsprintf(path,"/root/test/test4/plug3/plugin/%s","a2.so");ﻩﻩvoid*handle=dlopen(path,RTLD_LAZY); ﻩif(handle==0) { cout<<"dlopenerror"<<endl;ﻩ ﻩreturn0; } ﻩtypedefvoid(*FUNC_PRINT)();ﻩ FUNC_PRINTdl_print=(FUNC_PRINT)dlsym(handle,"f");ﻩ if(dl_print==0)ﻩﻩ{ﻩﻩ cout<<"dlsymerror"<<endl;ﻩ ﻩreturn0; ﻩ} (dl_print)();ﻩ dlclose(handle); } return0;}程序运营结果如图3所示:图3:插件输出程序4:CPluginEnumerator.h:#ifndefCPLUGINENUMERATOR_H#defineCPLUGINENUMERATOR_H#include<vector>#include<string>usingnamespacestd;classCPluginEnumerator{public:CPluginEnumerator();virtual~CPluginEnumerator();boolGetPluginNames(vector<string>&vstrPluginNames);};#endifCPluginEnumerator.cpp:#include"CPluginEnumerator.h"#include<dirent.h>#include<string.h>CPluginEnumerator::CPluginEnumerator(){}CPluginEnumerator::~CPluginEnumerator(){}boolCPluginEnumerator::GetPluginNames(vector<string>&vstrPluginNames){DIR*dir=opendir("./plugin");if(dir==0) returnfalse;for(;;){ structdirent*pentry=readdir(dir);ﻩif(pentry==0)ﻩbreak; if(strcmp(pentry->d_name,".")==0) continue; if(strcmp(pentry->d_name,"..")==0)ﻩcontinue;ﻩstringstr="./plugin/"; str+=pentry->d_name;ﻩvstrPluginNames.push_back(str);}closedir(dir);returntrue;}CPluginController.h#ifndefCPLUGINCONTROLLER_H#defineCPLUGINCONTROLLER_H#include<vector>classIPrintPlugin;classCPluginController{public:ﻩCPluginController(void);ﻩvirtual~CPluginController(void); boolInitializeController(void); boolUninitializeController(void); boolProcessHelp(void); boolProcessRequest(intFunctionID);private:ﻩstd::vector<void*>m_vhForPlugin; std::vector<IPrintPlugin*>m_vpPlugin;};#endifCPluginController.cpp#include"CPluginController.h"#include"CPluginEnumerator.h"#include"IPrintPlugin.h"#include"dlfcn.h"CPluginController::CPluginController(void){}CPluginController::~CPluginController(void){}boolCPluginController::InitializeController(void){ﻩstd::vector<std::string>vstrPluginNames; CPluginEnumeratorenumerator; if(!enumerator.GetPluginNames(vstrPluginNames)) returnfalse;ﻩfor(unsignedinti=0;i<vstrPluginNames.size();i++)ﻩ{ ﻩtypedefint(*PLUGIN_CREATE)(IPrintPlugin**); ﻩPLUGIN_CREATECreateProc; IPrintPlugin*pPlugin=NULL;ﻩ void*hinstLib=dlopen(vstrPluginNames[i].c_str(),RTLD_LAZY);ﻩﻩif(hinstLib!=NULL) {ﻩ ﻩm_vhForPlugin.push_back(hinstLib); ﻩ CreateProc=(PLUGIN_CREATE)dlsym(hinstLib,"CreateObj");ﻩ ﻩif(NULL!=CreateProc) ﻩ{ ﻩﻩ(CreateProc)(&pPlugin);ﻩ ﻩif(pPlugin!=NULL) ﻩ ﻩ{ﻩﻩﻩ m_vpPlugin.push_back(pPlugin);ﻩ ﻩ } ﻩ} ﻩ}ﻩ} returntrue;}boolCPluginController::ProcessRequest(intFunctionID){ﻩfor(unsignedinti=0;i<m_vpPlugin.size();i++)ﻩ{ if(m_vpPlugin[i]->GetID()==FunctionID) ﻩ{ ﻩm_vpPlugin[i]->Print();ﻩ ﻩbreak;ﻩ }ﻩ}ﻩreturntrue;}boolCPluginController::ProcessHelp(void){ std::vector<std::string>vstrPluginNames; CPluginEnumeratorenumerator;ﻩif(!enumerator.GetPluginNames(vstrPluginNames))ﻩﻩreturnfalse;ﻩfor(unsignedinti=0;i<vstrPluginNames.size();i++) {ﻩ typedefint(*PLUGIN_CREATE)(IPrintPlugin**);ﻩ PLUGIN_CREATECreateProc;ﻩ IPrintPlugin*pPlugin=NULL;ﻩﻩvoid*hinstLib=dlopen(vstrPluginNames[i].c_str(),RTLD_LAZY); if(hinstLib!=NULL)ﻩﻩ{ ﻩﻩCreateProc=(PLUGIN_CREATE)dlsym(hinstLib,"CreateObj");ﻩ ﻩif(NULL!=CreateProc) ﻩﻩ{ ﻩ (CreateProc)(&pPlugin); ﻩ ﻩif(pPlugin!=NULL) ﻩ ﻩ{ ﻩﻩﻩpPlugin->Help();ﻩﻩ } ﻩ}ﻩﻩ dlclose(hinstLib); }ﻩ} returntrue;}boolCPluginController::UninitializeController(){ for(unsignedinti=0;i<m_vhForPlugin.size();i++)ﻩ{ ﻩdlclose(m_vhForPlugin[i]); }ﻩreturntrue;}IPrintPlugin.h#pragmaonceclassIPrintPlugin{public: IPrintPlugin();ﻩvirtual~IPrintPlugin(); virtualvoidHelp()=0; virtualvoidPrint()=0;ﻩvirtualintGetID()=0;};IPrintPlugin.cpp#include"IPrintPlugin.h"IPrintPlugin::IPrintPlugin(){}IPrintPlugin::~IPrintPlugin(){}Function.cpp#include<iostream>#include"IPrintPlugin.h"usingnamespacestd;constintFUNC_ID=1;classCPrintPlugin:publicIPrintPlugin{public: CPrintPlugin()ﻩ{ﻩ} virtual~CPrintPlugin() {ﻩ}ﻩvirtualvoidPrint()ﻩ{ﻩﻩcout<<"HelloWorld!"<<endl;ﻩ}ﻩvirtualvoidHelp() {ﻩ cout<<"FunctionID"<<FUNC_ID<<":Thisfunctionwillprinthelloworld."<<endl;ﻩ}ﻩvirtualintGetID(void) { ﻩreturnFUNC_ID; }};extern"C"voidCreateObj(IPrintPlugin**ppPlugin){ﻩstaticCPrintPluginplugin;ﻩ*ppPlugin=&plugin;}function1.cpp#include<iostream>#include"IPrintPlugin.h"usingnamespacestd;constintFUNC_ID=2;classCPrintPlugin:publicIPrintPlugin{public: CPrintPlugin()ﻩ{ﻩ}ﻩvirtual~CPrintPlugin() {ﻩ} virtualvoidPrint()ﻩ{ﻩﻩcout<<"HelloChina!"<<endl; } virtualvoidHelp()ﻩ{ﻩﻩcout<<"FunctionID"<<FUNC_ID<<":Thisfunctionwillprinthellochina."<<endl; } virtualintGetID(void) {ﻩﻩreturnFUNC_ID;ﻩ}};extern"C"voidCreateObj(IPrintPlugin**ppPlugin){ staticCPrintPluginplugin;ﻩ*ppPlugin=&plugin;}Main.cpp#include<iostream>#include"CPluginController.h"#include<string.h>#include<stdlib.h>usingnamespacestd;intmain(intargc,char**argv){ﻩif(argc!=2)ﻩ{ cout<<"Parameterserror"<<endl;ﻩﻩreturn0; } if(strcmp(argv[1],"help")==0)ﻩ{ﻩ CPluginControllerpc; pc.ProcessHelp();ﻩ return0;ﻩ} intFunctionID=atoi(argv[1]);ﻩCPluginControllerpc;ﻩpc.InitializeController();ﻩpc.ProcessRequest(FunctionID); pc.UninitializeController();ﻩreturn0;}程序运营结果如图4所示:图4:插件获取类对象综合练习:CPluginController.cpp#include"CPluginController.h"#include"CPluginEnumerator.h"#include"IPrintPlugin.h"#include"dlfcn.h"#include<string.h>CPluginController::CPluginController(void){}CPluginController::~CPluginController(void){}boolCPluginController::InitializeController(void){ﻩstd::vector<std::string>vstrPluginNames; CPluginEnumeratorenumerator;ﻩif(!enumerator.GetPluginNames(vstrPluginNames))ﻩﻩreturnfalse;ﻩfor(unsignedinti=0;i<vstrPluginNames.size();i++)ﻩ{ typedefint(*PLUGIN_CREATE)(IPrintPlugin**); ﻩPLUGIN_CREATECreateProc;ﻩﻩIPrintPlugin*pPlugin=NULL;ﻩﻩvoid*hinstLib=dlopen(vstrPluginNames[i].c_str(),RTLD_LAZY); ﻩif(hinstLib!=NULL)ﻩﻩ{ﻩﻩ m_vhForPlugin.push_back(hinstLib);ﻩﻩﻩCreateProc=(PLUGIN_CREATE)dlsym(hinstLib,"CreateObj");ﻩﻩﻩif(NULL!=CreateProc)ﻩ {ﻩﻩ ﻩ(CreateProc)(&pPlugin); ﻩif(pPlugin!=NULL)ﻩﻩ {ﻩﻩ ﻩﻩm_vpPlugin.push_back(pPlugin); }ﻩ ﻩ}ﻩﻩ} }ﻩreturntrue;}boolCPluginController::ProcessRequest(intFunctionID){ for(unsignedinti=0;i<m_vpPlugin.size();i++)ﻩ{ﻩﻩif(m_vpPlugin[i]->GetID()==FunctionID) {ﻩ m_vpPlugin[i]->Print(); ﻩ break; ﻩ} } returntrue;}boolCPluginController::ProcessHelp(void){ﻩstd::vector<std::string>vstrPluginNames;ﻩCPluginEnumeratorenumerator; if(!enumerator.GetPluginNames(vstrPluginNames))ﻩﻩreturnfalse; for(unsignedinti=0;i<vstrPluginNames.size();i++) { typedefint(*PLUGIN_CREATE)(IPrintPlugin**); PLUGIN_CREATECreateProc; IPrintPlugin*pPlugin=NULL; ﻩvoid*hinstLib=dlopen(vstrPluginNames[i].c_str(),RTLD_LAZY);ﻩ if(hinstLib!=NULL)ﻩﻩ{ﻩ CreateProc=(PLUGIN_CREATE)dlsym(hinstLib,"CreateObj");ﻩ ﻩif(NULL!=CreateProc)ﻩ ﻩ{ ﻩﻩ (CreateProc)(&pPlugin);ﻩ ﻩif(pPlugin!=NULL) ﻩﻩ {ﻩﻩﻩﻩﻩpPlugin->Help(); ﻩ ﻩ} ﻩ}ﻩ ﻩdlclose(hinstLib); ﻩ}ﻩ}ﻩreturntrue;}boolCPluginController::IfProcess(char*Function)//判断插件是否存在{ﻩunsignedinti;ﻩfor(i=0;i<m_vpPlugin.size();i++)ﻩ{ if(strcmp(Function,m_vpPlugin[i]->GetName())==0) {ﻩﻩ break;ﻩﻩ}ﻩ}; if(i<m_vpPlugin.size())//插件存在ﻩ{ ﻩreturntrue; }ﻩelse { ﻩreturnfalse; }}boolCPluginController::ProcessFunction(char*Function,char*Document)//执行插件功能{ for(unsignedinti=0;i<m_vpPlugin.size();i++)ﻩ{ ﻩif(strcmp(Function,m_vpPlugin[i]->GetName())==0)ﻩﻩ{ m_vpPlugin[i]->Fun(Document);//插件功能ﻩ break; } } returntrue;}boolCPluginController::UninitializeController(){ﻩfor(unsignedinti=0;i<m_vhForPlugin.size();i++)ﻩ{ dlclose(m_vhForPlugin[i]); }ﻩreturntrue;}CPluginController.h#ifndefCPLUGINCONTROLLER_H#defineCPLUGINCONTROLLER_H#include<vector>classIPrintPlugin;classCPluginController{public: CPluginController(void); virtual~CPluginController(void);ﻩ boolInitializeController(void);ﻩboolUninitializeController(void); boolProcessHelp(void);ﻩboolProcessRequest(intFunctionID); boolIfProcess(char*Function); boolProcessFunction(char*Function,char*Document);private:ﻩstd::vector<void*>m_vhForPlugin;ﻩstd::vector<IPrintPlugin*>m_vpPlugin;};#endifCPluginEnumerator.h#ifndefCPLUGINENUMERATOR_H#defineCPLUGINENUMERATOR_H#include<vector>#include<string>usingnamespacestd;classCPluginEnumerator{public:CPluginEnumerator();virtual~CPluginEnumerator();boolGetPluginNames(vector<string>&vstrPluginNames);};#endifCPluginEnumerator.cpp#include"CPluginEnumerator.h"#include<dirent.h>#include<string.h>CPluginEnumerator::CPluginEnumerator(){}CPluginEnumerator::~CPluginEnumerator(){}boolCPluginEnumerator::GetPluginNames(vector<string>&vstrPluginNames){DIR*dir=opendir("./plugin");if(dir==0) returnfalse;for(;;){ structdirent*pentry=readdir(dir); if(pentry==0)ﻩbreak;ﻩif(strcmp(pentry->d_name,".")==0) continue;ﻩif(strcmp(pentry->d_name,"..")==0) continue;ﻩstringstr="./plugin/";ﻩstr+=pentry->d_name; vstrPluginNames.push_back(str);}closedir(dir);returntrue;}Main.cpp#include<iostream>#include"CPluginController.h"#include<string.h>#include<stdlib.h>usingnamespacestd;intmain(intargc,char**argv){ if(argc==2)ﻩ{ if(strcmp(argv[1],"help")==0)//帮助功能 ﻩ{ ﻩ CPluginControllerpc; ﻩﻩpc.ProcessHelp();ﻩ ﻩreturn0;ﻩﻩ} ﻩelseﻩﻩ{ﻩ ﻩintFunctionID=atoi(argv[1]);ﻩCPluginControllerpc; pc.InitializeController(); pc.ProcessRequest(FunctionID);ﻩpc.UninitializeController(); return0;ﻩ }ﻩ} elseif(argc==3)ﻩ{ﻩ CPluginControllerpc;ﻩ char*Function=argv[1];//ﻩ Function+=".so"; char*Document=argv[2];//操作的文献名 pc.InitializeController();ﻩ if(pc.IfProcess(Function)==false)//判断插件是否存在 { ﻩcout<<"Nothisplugin!"<<endl; } ﻩelse// { pc.ProcessFunction(Function,Document);ﻩ };ﻩ pc.UninitializeController();ﻩ return0;ﻩ} else { cout<<"Parameterserror"<<endl; ﻩreturn0; }ﻩ}插件:IPrintPlugin.cpp#include"IPrintPlugin.h"IPrintPlugin::IPrintPlugin(){}IPrintPlugin::~IPrintPlugin(){}IPrintPlugin.h#pragmaonceclassIPrintPlugin{public:ﻩIPrintPlugin(); virtual~IPrintPlugin(); virtualvoidHelp()=0;ﻩvirtualvoidPrint()=0;ﻩvirtualintGetID()=0; virtualchar*GetName()=0;//添加部分ﻩvirtualvoidFun(char*)=0;};Line.cpp#include<iostream>#include"IPrintPlugin.h"#include<unistd.h>//read(file)#include<fcntl.h>#include<string.h>usingnamespacestd;constintFUNC_ID=3;charFUNC_NAME[]="sl";//statisticsline!classCPrintPlugin:publicIPrintPlugin{public:ﻩCPrintPlugin()ﻩ{ } virtual~CPrintPlugin() {ﻩ} virtualvoidPrint()ﻩ{ cout<<"Statisticsthedocumentline!"<<endl;ﻩ}ﻩvirtualvoidHelp()ﻩ{ﻩﻩcout<<"FunctionID"<<FUNC_ID<<":Thisfunctionwillstatisticsthedocumentline."<<endl; }ﻩvirtualintGetID(void)ﻩ{ ﻩreturnFUNC_ID;ﻩ}ﻩvirtu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 硝普钠治疗心衰的护理
- 年产xxx集群移动通信设备项目建议书
- 腰线项目可行性研究报告
- 综合部部门规划
- 小班健康教案:小鸡长大了
- 大班健康教案及教学反思《接棒跑》
- 小班感恩教案:母亲节
- 一年级上册数学导学案-5.3.2 5、4、3、2加几的练习课∣人教新课标
- 脑血管病术后护理
- 小班主题教案《小动物》
- 医疗健康管理项目推广运营方案
- 胃石症的护理查房
- 河道拉管施工方案
- 危大工程监理巡视检查用表
- 初中语文七年级上册《潼关》课件
- 江苏省2023-2024学年四年级上学期数学期中备考卷一(南通专版)
- 常用材料物性一览表
- 【地理】河流地貌教学设计 2023-2024学年高中地理人教版(2019)必修第一册
- 第19章:磁场中的磁介质
- 人教-高一英语必修三-Unit4-听说课-名师教学设计
- 研学日游活动方案及流程
评论
0/150
提交评论