




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師:實(shí)驗(yàn)地點(diǎn):A2-412 實(shí)驗(yàn)時(shí)間:2012.01.04一、實(shí)驗(yàn)室名稱:Linux環(huán)境高級(jí)編程實(shí)驗(yàn)室二、實(shí)驗(yàn)項(xiàng)目名稱:插件框架實(shí)驗(yàn)三、實(shí)驗(yàn)學(xué)時(shí):4學(xué)時(shí)四、實(shí)驗(yàn)?zāi)康模簩W(xué)習(xí)和實(shí)踐插件框架的開(kāi)發(fā)。理解插件的工作原理,為進(jìn)一步開(kāi)發(fā)高可用,高復(fù)雜度的插件打下基礎(chǔ)。五、實(shí)驗(yàn)內(nèi)容:1、使用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)打印功能:開(kāi)發(fā)一個(gè)程序,向屏幕打印“Hello World”;在不重新編譯鏈接原程序的前提下,將打印的文字改為“Hello China”。2、使用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)自定義打印功能:1 / 31同時(shí)要打印“Hello World”,打印“Hello
2、China”,甚至同時(shí)打印未來(lái)才會(huì)增加的其他打印信息,打印信息的鏈接庫(kù)放在一個(gè)固定目錄中,遍歷這個(gè)目錄,獲取所有動(dòng)態(tài)鏈接庫(kù)。打印未來(lái)的這些信息,也不能重新編譯鏈接原程序。3、1)通過(guò)命令行方式:./a.out help,輸出所有插件實(shí)現(xiàn)的功能ID,以及該功能ID對(duì)應(yīng)的功能描述。2)通過(guò)命令行方式:./a.out FuncID,調(diào)用具體打印功能(每個(gè)插件導(dǎo)出GetID接口)。4、將插件導(dǎo)出的Print、GetID、Help三個(gè)函數(shù)放在一個(gè)類中,主程序需要使用多個(gè)容器分別保存這些函數(shù)地址,讓插件外部獲取該類的對(duì)象。綜合練習(xí):實(shí)現(xiàn)一個(gè)軟件系統(tǒng),該系統(tǒng)可對(duì)文件進(jìn)行統(tǒng)計(jì)分析。究竟對(duì)文件進(jìn)行什么樣的統(tǒng)計(jì)分
3、析,最終用戶自己也不是很清楚,目前只知道需要統(tǒng)計(jì)文件的行數(shù)。也就是說(shuō),本軟件系統(tǒng)將會(huì)隨時(shí)面臨,增加文件統(tǒng)計(jì)新功能的難題。請(qǐng)結(jié)合本實(shí)驗(yàn)內(nèi)容,設(shè)計(jì)并實(shí)現(xiàn)這樣一個(gè)面向文件統(tǒng)計(jì)功能的插件系統(tǒng)。(需要實(shí)現(xiàn)的插件包括:統(tǒng)計(jì)某個(gè)文件的行數(shù),統(tǒng)計(jì)某個(gè)文件的字節(jié)數(shù))六、實(shí)驗(yàn)步驟:程序1:A. h:extern "c" void f();a2.cpp:#include<iostream>#include"a.h"using namespace std;void f() cout << "hello,China!" <<
4、 endl;A1.cpp:#include<iostream>#include"a.h"using namespace std;void f() cout << "Hello,Word" << endl;Main.cpp:#include"a.h"#include<dlfcn.h>#include<iostream>using namespace std;int main() void *handle = dlopen("./libtest.so", RT
5、LD_LAZY); if(0 = handle) cout << "dlopen error" << endl;return 0; typedef void (*Fun)(); Fun f1 = (Fun)dlsym(handle, "f"); if(0 = f1) cout << "f1 error" << endl; char *str = dlerror();cout << str << endl; (*f1)(); dlclose(handle); ret
6、urn 0;程序運(yùn)行結(jié)果如圖1所示:圖1:字符的變換程序2:A1.cpp:#include<iostream>using namespace std;extern"C" void f()cout << "Hello world" << endl;A2.cpp:#include<iostream>using namespace std;extern "C" void f() cout << "Hello,china!" << endl;A3.cp
7、p:#include<iostream>using namespace std;extern "C" void f()cout << "Hello 333" << endl;A4.cpp:#include<iostream>using namespace std;extern "C" void f()cout << "Hello 4444" << endl;Test2.cpp:#include<dlfcn.h>#include<
8、;iostream>#include<dirent.h>#include<stdio.h>#include<string.h>using namespace std;int main()char path260;DIR *dir;struct dirent *ptr; dir=opendir("/root/test/test4/plug2/plugin/");while(ptr=readdir(dir)!=NULL)if (strcmp(ptr->d_name,".")=0)|(strcmp(ptr->
9、;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 << "dlopen error" << endl;return 0; typedef void (*Fun)(); Fun pf = (Fun)dlsym(handle, "f"); if(0
10、= pf) cout << "pf error" << endl; char *str = dlerror();cout << str << endl;return 0; (*pf)();dlclose(handle); closedir(dir);程序運(yùn)行結(jié)果如圖2所示:圖2:插件的遍歷程序3:a1.cpp:#include <iostream>using namespace std;const int FUNC_ID = 1;extern "C" void f() cout <<
11、 "Hello World!" << endl;extern "C" void Help() cout << "Function ID " << FUNC_ID << " : This function prints Hello World." << endl;a2.cpp:#include <iostream>using namespace std;const int FUNC_ID = 2;extern "C" void
12、 f() cout << "Hello China!" << endl;extern "C" void Help() cout << "Function ID " << FUNC_ID << " This function prints hello china." << endl;CPluginEnumerator.cpp#include "CPluginEnumerator.h"#include <dirent.h&
13、gt;#include <string.h>#include <iostream>#include <stdio.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& vstrPluginNames) DIR *dir = opendir("/root/test/test4/plug3/plugin"); if(di
14、r = 0)return false; for(;) struct dirent *ptr = readdir(dir);if(ptr = 0)break;if(strcmp(ptr->d_name, ".") = 0)|(strcmp(ptr->d_name, ".") = 0)continue;char path260;sprintf(path, "/root/test/test4/plug3/plugin/%s", ptr->d_name);vstrPluginNames.push_back(path); cl
15、osedir(dir);return true;Test.cpp:#include <dlfcn.h>#include <iostream>#include "CPluginEnumerator.h"#include <string.h>#include <stdio.h>using namespace std;int main(int argc, char *argv)char path 260; if(argc != 2)return 0; if(strcmp(argv1, "help") = 0) v
16、ector<string> vstrPluginNames; CPluginEnumerator enumerator; if(!enumerator.GetPluginNames(vstrPluginNames) cout << "GetPluginNames error" << endl;return 0; for(int i = 0; i< vstrPluginNames.size(); i+) void *handle = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY);if(hand
17、le = 0)cout << "dlopen error" << endl; return 0;typedef void (*FUNC_HELP)();FUNC_HELP dl_help = (FUNC_HELP)dlsym(handle, "Help");if(dl_help = 0)cout << "dlsym error" << endl; return 0;(dl_help)();dlclose(handle);else if(strcmp(argv1, "1"
18、;) = 0)sprintf(path, "/root/test/test4/plug3/plugin/%s", "a1.so");void *handle = dlopen(path, RTLD_LAZY);if(handle = 0)cout << "dlopen error" << endl;return 0;typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, "f");if(dl_p
19、rint = 0)cout << "dlsym error" << endl;return 0;(dl_print)();dlclose(handle);else if(strcmp(argv1, "2") = 0)/ 得到第二個(gè)func的參數(shù)sprintf(path, "/root/test/test4/plug3/plugin/%s", "a2.so");void *handle = dlopen(path, RTLD_LAZY);if(handle = 0)cout <<
20、"dlopen error" << endl;return 0;typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, "f");if(dl_print = 0)cout << "dlsym error" << endl;return 0;(dl_print)();dlclose(handle);return 0;程序運(yùn)行結(jié)果如圖3所示:圖3:插件輸出程序4:CPluginEnumerator.h:#i
21、fndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector<string>& vstrPluginNames);#endifCPluginEnumerator.cpp:#include &
22、quot;CPluginEnumerator.h"#include <dirent.h>#include <string.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& vstrPluginNames) DIR *dir = opendir("./plugin"); if(dir = 0)return false
23、; for(;) struct dirent *pentry = readdir(dir);if(pentry = 0) break;if(strcmp(pentry->d_name, ".") = 0) continue;if(strcmp(pentry->d_name, ".") = 0) continue;string str = "./plugin/"str += pentry->d_name;vstrPluginNames.push_back(str); closedir(dir); return true
24、;CPluginController.h#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include <vector>class IPrintPlugin;class CPluginControllerpublic:CPluginController(void);virtual CPluginController(void);bool InitializeController(void);bool UninitializeController(void);bool ProcessHelp(void);bool Proc
25、essRequest(int FunctionID);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"CPluginContro
26、ller:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(
27、); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) m_vhForPlugin.push_back(hinstLib);CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL !=
28、 CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)m_vpPlugin.push_back(pPlugin);return true;bool CPluginController:ProcessRequest(int FunctionID)for(unsigned int i = 0; i < m_vpPlugin.size(); i+)if(m_vpPlugini->GetID() = FunctionID)m_vpPlugini->Print();break;return true;bool CPlugi
29、nController:ProcessHelp(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin
30、*pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.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);return true;bool CPluginCon
31、troller:UninitializeController()for(unsigned int i = 0; i < m_vhForPlugin.size(); i+)dlclose(m_vhForPlugini);return true;IPrintPlugin.h#pragma onceclass IPrintPluginpublic:IPrintPlugin();virtual IPrintPlugin();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;IPrintPlugin.c
32、pp#include "IPrintPlugin.h"IPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()Function.cpp#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC_ID = 1;class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void
33、 Print()cout << "Hello World!" << endl;virtual void Help()cout << "Function ID " << FUNC_ID << " : This function will print hello world." << endl;virtual int GetID(void)return FUNC_ID;extern "C" void CreateObj(IPrintPlugin *
34、ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;function1.cpp#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC_ID = 2;class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout << "He
35、llo China!" << endl;virtual void Help()cout << "Function ID " << FUNC_ID << " : This function will print hello china." << endl;virtual int GetID(void)return FUNC_ID;extern "C" void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin p
36、lugin;*ppPlugin = &plugin;Main.cpp#include <iostream>#include "CPluginController.h"#include <string.h>#include <stdlib.h>using namespace std;int main(int argc, char *argv)if(argc != 2)cout << "Parameters error" << endl;return 0;if(strcmp(argv1, &
37、quot;help") = 0)CPluginController pc;pc.ProcessHelp();return 0;int FunctionID = atoi(argv1);CPluginController pc;pc.InitializeController();pc.ProcessRequest(FunctionID);pc.UninitializeController();return 0;程序運(yùn)行結(jié)果如圖4所示:圖4:插件獲取類對(duì)象綜合練習(xí):CPluginController.cpp#include "CPluginController.h"#
38、include "CPluginEnumerator.h"#include "IPrintPlugin.h"#include "dlfcn.h"#include <string.h>CPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector<std:string> vstrPluginNam
39、es;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_
40、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);return true;bool CPluginController:ProcessRequest(int FunctionID)for(un
41、signed int i = 0; i < m_vpPlugin.size(); i+)if(m_vpPlugini->GetID() = FunctionID)m_vpPlugini->Print();break;return true;bool CPluginController:ProcessHelp(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return fals
42、e;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj&q
43、uot;); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)pPlugin->Help();dlclose(hinstLib);return true;bool CPluginController:IfProcess(char *Function)/判斷插件是否存在unsigned int i;for(i = 0; i < m_vpPlugin.size(); i+)if(strcmp(Function, m_vpPlugini->GetName() = 0)break;if(i &l
44、t; m_vpPlugin.size()/插件存在return true;elsereturn false;bool CPluginController:ProcessFunction(char *Function,char*Document)/執(zhí)行插件功能for(unsigned int i = 0; i < m_vpPlugin.size(); i+)if(strcmp(Function, m_vpPlugini->GetName() = 0)m_vpPlugini->Fun(Document);/插件功能break;return true;bool CPluginCon
45、troller:UninitializeController()for(unsigned int i = 0; i < m_vhForPlugin.size(); i+)dlclose(m_vhForPlugini);return true;CPluginController.h#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include <vector>class IPrintPlugin;class CPluginControllerpublic:CPluginController(void);virtual
46、 CPluginController(void);bool InitializeController(void);bool UninitializeController(void);bool ProcessHelp(void);bool ProcessRequest(int FunctionID);bool IfProcess(char *Function);bool ProcessFunction(char *Function,char *Document);private:std:vector<void *> m_vhForPlugin;std:vector<IPrint
47、Plugin*> m_vpPlugin;#endifCPluginEnumerator.h#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector<string>& vstrP
48、luginNames);#endifCPluginEnumerator.cpp#include "CPluginEnumerator.h"#include <dirent.h>#include <string.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& vstrPluginNames) DIR *dir = opend
49、ir("./plugin"); if(dir = 0)return false; for(;) struct dirent *pentry = readdir(dir);if(pentry = 0) break;if(strcmp(pentry->d_name, ".") = 0) continue;if(strcmp(pentry->d_name, ".") = 0) continue;string str = "./plugin/"str += pentry->d_name;vstrPlugi
50、nNames.push_back(str); closedir(dir); return true;Main.cpp#include <iostream>#include "CPluginController.h"#include <string.h>#include <stdlib.h>using namespace std;int main(int argc, char *argv)if(argc = 2)if(strcmp(argv1, "help") = 0)/幫助功能CPluginController pc;
51、pc.ProcessHelp();return 0;elseint FunctionID = atoi(argv1); CPluginController pc; pc.InitializeController(); pc.ProcessRequest(FunctionID); pc.UninitializeController();return 0;else if(argc = 3)CPluginController pc;char *Function = argv1;/Function+=".so"char *Document = argv2;/操作的文件名pc.Ini
52、tializeController();if(pc.IfProcess(Function)=false)/判斷插件是否存在cout << "No this plugin!" << endl;else/ pc.ProcessFunction(Function,Document);pc.UninitializeController();return 0;elsecout << "Parameters error" << endl;return 0;插件:IPrintPlugin.cpp#include &quo
53、t;IPrintPlugin.h"IPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()IPrintPlugin.h#pragma onceclass IPrintPluginpublic:IPrintPlugin();virtual IPrintPlugin();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;virtual char * GetName() = 0;/添加部分virtual void Fun(char*) = 0;
54、Line.cpp#include <iostream>#include "IPrintPlugin.h"#include <unistd.h>/read(file)#include <fcntl.h>#include <string.h>using namespace std;const int FUNC_ID = 3;char FUNC_NAME="sl"/statistics line!class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout << "Statistics the document line!" << endl;virtual v
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 手術(shù)室護(hù)理指南:手術(shù)隔離技術(shù)
- 勝任才是硬道理培訓(xùn)教材
- 中班健康:身體上的寶貝
- 糖尿病合并高血壓個(gè)案護(hù)理
- 轉(zhuǎn)移性骨腫瘤的護(hù)理及管理
- 2025年品質(zhì)培訓(xùn)資料
- 住宅小區(qū)停車庫(kù)租賃合同
- 辦公家具定制化設(shè)計(jì)與售后服務(wù)承諾書(shū)
- 城市綠化帶場(chǎng)地?zé)o償使用與生態(tài)維護(hù)協(xié)議
- 電力設(shè)備與廠房使用權(quán)轉(zhuǎn)讓合同
- 2024版新能源汽車充電站場(chǎng)地租賃及充電服務(wù)合同2篇
- 特種設(shè)備日管控、周排查、月調(diào)度模板
- 急性髓系白血病護(hù)理個(gè)案
- 兒童膿毒血癥護(hù)理
- 頂板事故應(yīng)急演練
- 智研咨詢發(fā)布:中國(guó)企業(yè)數(shù)字化解決方案行業(yè)市場(chǎng)發(fā)展環(huán)境及前景研究報(bào)告
- 《大學(xué)計(jì)算機(jī)基礎(chǔ)案例教程(微課版)第2版》全套教學(xué)課件
- 食堂食材配送采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 貴州遵義四中2022自主招生物理試卷試題真題(含答案)
- NBT 35095-2017 水電工程小流域水文計(jì)算規(guī)范
- 2024年廣東省中考生物試卷(含答案)
評(píng)論
0/150
提交評(píng)論