中間件實(shí)驗(yàn)1-COM.doc_第1頁(yè)
中間件實(shí)驗(yàn)1-COM.doc_第2頁(yè)
中間件實(shí)驗(yàn)1-COM.doc_第3頁(yè)
中間件實(shí)驗(yàn)1-COM.doc_第4頁(yè)
中間件實(shí)驗(yàn)1-COM.doc_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

中間件技術(shù)原理及應(yīng)用實(shí)驗(yàn)一任務(wù)書實(shí)驗(yàn)內(nèi)容:COM組件對(duì)象的設(shè)計(jì)與應(yīng)用實(shí)驗(yàn)?zāi)康模和ㄟ^對(duì)簡(jiǎn)單 COM組件的編寫,加深對(duì) COM理論知識(shí)的理解,為更深層的 COM應(yīng)用及DCOM應(yīng)用做準(zhǔn)備。實(shí)驗(yàn)任務(wù):按照組件化程序設(shè)計(jì)方法,用 Visual C+編寫實(shí)現(xiàn)包含 ICalculate、IMul2個(gè)接口的dll組件,并利用客戶端應(yīng)用程序完成對(duì)各接口的充分測(cè)試。學(xué)生專業(yè):軟件工程實(shí)習(xí)地點(diǎn):9-2041、實(shí)驗(yàn)原理COM組件 IUnknownIUnknownIAddCOM對(duì)象 1COM對(duì)象 2MathIMul接口IAddIMul成員函數(shù)Add(long n1, long n2, long * pnVal)-加法運(yùn)算Mul(long n1, long n2, long *pnVal)-乘法運(yùn)算 2、實(shí)驗(yàn)要求:獨(dú)立完成 COM組件和客戶端測(cè)試程序的編寫。在實(shí)驗(yàn)報(bào)告中記錄相關(guān)實(shí)現(xiàn)代碼,并在實(shí)驗(yàn)報(bào)告中記錄結(jié)果。要求客戶端調(diào)用測(cè)試加法運(yùn)算和乘法運(yùn)算。3、實(shí)驗(yàn)步驟:1.分析組件結(jié)構(gòu)。2.編寫簡(jiǎn)單.dll組件。3.逐步添加接口。4.編寫客戶端應(yīng)用程序進(jìn)行測(cè)試。用regedit命令打開注冊(cè)表注銷操作:RegSvr32 /u c:XXXXX.dll注冊(cè)操作:RegSvr32 c:XXXXX.dll在運(yùn)行客戶程序前,必須先注冊(cè)組件程序。5.寫出上機(jī)實(shí)驗(yàn)報(bào)告。4、實(shí)驗(yàn)報(bào)告格式1.畫出實(shí)驗(yàn)所設(shè)計(jì)的COM組件的結(jié)構(gòu)2.關(guān)鍵代碼(1)組件部分的關(guān)鍵代碼idl文件內(nèi)COM對(duì)象和接口的關(guān)鍵定義代碼C+文件中成員函數(shù)的關(guān)鍵實(shí)現(xiàn)代碼(2)客戶端測(cè)試程序中組件調(diào)用部分的關(guān)鍵代碼3.實(shí)驗(yàn)結(jié)果5、實(shí)驗(yàn)步驟提示 一)、建立 ATL工程IUnknown接口成員函數(shù)IMathIMathAdd(long n1, long n2, long * pnVal)步驟 1:建立一個(gè)工作區(qū)(WorkSpace)。步驟 2:在工作區(qū)中,新建一個(gè) ATL工程(Project)。命名為 SimpleCom(如圖 1),并選擇DLL方式(如圖 2)。圖 1新建 ATL工程 圖 2選擇 DLL類型 說明:Dynamic Link Library(DLL)表示建立一個(gè) DLL的組件程序。Executable(EXE)表示建立一個(gè) EXE的組件程序。Service(EXE)表示建立一個(gè)服務(wù)程序,系統(tǒng)啟動(dòng)后就會(huì)加載并執(zhí)行的程序。Allow merging of proxy/stub code選擇該項(xiàng)表示把“代理/存根”代碼合并到組件程序中,否則需要單獨(dú)編譯,單獨(dú)注冊(cè)代理存根程序。Support MFC支持 MFCSupport MTS支持事務(wù)處理,即是否支持 COM+功能。二)、增加 ATL對(duì)象類步驟 3:選擇菜單 InsertNew ATL ObjectObject分類Simple Object項(xiàng)目。見圖 3。 圖 3選擇建立簡(jiǎn)單 COM對(duì)象說明:(1)Category Object普通組件。其中可以選擇的組件對(duì)象類型很多,本質(zhì)上就是讓向?qū)兔由弦恍┠J(rèn)接口。(2)Category Controls ActiveX控件。其中可以選擇的 ActiveX類型也很多。(3)Category Miscellaneous輔助雜類組件。(4)Categroy Data Access數(shù)據(jù)庫(kù)類組件。步驟 4:增加自定義類 CMath(接口 IMath),見圖 4。 圖 4輸入類中的各項(xiàng)名稱步驟 5:填寫接口屬性,見圖 5。圖 5接口屬性 說明:Threading Model選擇組件支持的線程模型。Interface接口基本類型。Dual表示支持雙接口;Custom表示自定義借口。Aggregation是否允許被別人聚合使用。No表示不聚合。Support ISupportErrorInfo是否支持豐富信息的錯(cuò)誤處理接口。Support Connection Points是否支持連接點(diǎn)接口(事件、回調(diào))。Free Threaded Marshaler三)、添加接口成員函數(shù)圖 6調(diào)出增加接口方法的菜單 圖 7增加接口函數(shù) Add說明:in表示參數(shù)方向是輸入;out表示參數(shù)方向是輸出;out,retval表示參數(shù)方向是輸出,同時(shí)可以作為函數(shù)運(yùn)算結(jié)果的返回值。一個(gè)函數(shù)中,可以有多個(gè)in、out,但retval只能有一個(gè),并且要和out組合后在最后一個(gè)位置。圖 8接口函數(shù)實(shí)現(xiàn)代碼如下:STDMETHODIMP CMath:Add(long n1, long n2, long * pnVal)/ TODO: Add your implementation code here* pnVal = n1 + n2;return S_OK;完成上述步驟后,打開 IDL文件(雙擊 IMath接口),手工添加代碼,其中 UUID每個(gè)組件,每個(gè)接口都會(huì)不同。/引入 IUnknown和 ATL已經(jīng)定義的其它接口描述文件。import oaidl.idl;import ocidl.idl;/接口的完整描述object,/表示本塊描述的是一個(gè)接口uuid(E34275D2-B3CA-4BCA-9AC7-0713ABE2F876),helpstring(IMath Interface), / 說明文字pointer_default(unique)/定義接口函數(shù)中參數(shù)所使用指針的默認(rèn)屬性interface IMath : IUnknown/接口叫 IMathe派生自 IUnknown/接口函數(shù)列表 helpstring(method Add) HRESULT Add(in long n1, in long n2, out,retval long* pnVal);/類型庫(kù)的完整描述uuid(FBF0BE44-9E98-4189-809B-BEC4B67866CC),version(1.0),helpstring(SimpleCom 1.0 Type Library)library SIMPLECOMLib/#import時(shí)候的默認(rèn)命名空間importlib(stdole32.tlb);importlib(stdole2.tlb);uuid(9D4F4C3B-A41F-4A3A-9FF2-F8784DBE2CC5),/組件的 CLSIDhelpstring(Math Class)coclass Math/ 接口列表default interface IMath;/default表示接口 IMath提供了 IUnknown接口;四)、打開頭文件(Math.h),手工增加類的派生關(guān)系和接口入口表,然后保存。#ifndef _MATH_H_#define _MATH_H_#include resource.h/ main symbols/ CMathclass ATL_NO_VTABLE CMath :public CComObjectRootEx,public CComCoClass,public IMath,/增加一個(gè)分隔符逗號(hào)public:CMath()DECLARE_REGISTRY_RESOURCEID(IDR_MATH)DECLARE_NOT_AGGREGATABLE(CMath)DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CMath)COM_INTERFACE_ENTRY(IMath)END_COM_MAP()/ IMathpublic:STDMETHOD(Add)(/*in*/ long n1, /*in*/ long n2, /*out,retval*/ long * pnVal);#endif /_MATH_H_五)、編譯 DLL按下 F7鍵,編譯器工作片刻后就會(huì)在注冊(cè)表中注冊(cè)你的新 DLL了,這樣一來其它的程序就可以使用它了。-Configuration: SimpleCom - Win32 Debug-Compiling.Mul.cppGenerating Code.Skipping. (no relevant changes detected)SimpleCom.cppAdd.cppLinking.Creating library Debug/SimpleCom.lib and object Debug/SimpleCom.expPerforming registrationSimpleCom.dll - 0 error(s), 0 warning(s)圖 9編譯 dll 六)、在 Visual C+中新建工程,編寫客戶端程序,進(jìn)行組件測(cè)試。步驟 1:新建工程。選擇“Win32 Console Application”,起名為“TestCom”,在下一個(gè)窗口中單擊 OK按鈕接受所有默認(rèn)值,最后單擊 Finish按鈕。 步驟 2:新建文件新建“C+ Source File”文件并命名為“TestCom.cpp”,單擊 OK接受。在空白文件中添加一些代碼來測(cè)試 COM服務(wù)器。代碼如下:#include .SimpleComSimpleCom.h#include .SimpleComSimpleCom_i.c#include #include #include void main(void)/指明工程路徑,引用頭文件/各 GUID在 xxx_i.c文件中/輸入輸出/字符串類型轉(zhuǎn)換/字符串類型轉(zhuǎn)換HRESULThr;IUnknown *pUnknown;IMath*IMathAdd = NULL;GUID MathCLSID;hr = CoInitialize(0);if(hr=S_OK)/COM庫(kù)初始化hr=:CLSIDFromProgID(LSimpleCom.Math.1,&MathCLSID);hr = CoCreateInstance( MathCLSID, NULL, CLSCTX_INPROC_SERVER,IID_IUnknown,(void*) &pUnknown);if(hr=S_OK)hr=pUnknown-QueryInterface(IID_IMath,(void *

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論