com培訓(xùn)_第1頁(yè)
已閱讀1頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、COM:可連接對(duì)象 & 結(jié)構(gòu)化存儲(chǔ),潘愛(ài)民http://www.icst.pku.edu.cn/CompCourse,內(nèi)容,復(fù)習(xí):COM基礎(chǔ)可連接對(duì)象結(jié)構(gòu)化存儲(chǔ),,復(fù)習(xí):COM基礎(chǔ),,COM組件,COM客戶,{IXxx *p;p->…},,聚合模型的關(guān)鍵,可連接對(duì)象(connectable object),內(nèi)容:可連接對(duì)象結(jié)構(gòu)模型實(shí)現(xiàn)可連接對(duì)象(源對(duì)象)客戶-源對(duì)象-接收器的協(xié)作過(guò)程可連接對(duì)象的程

2、序?qū)崿F(xiàn),雙向通信機(jī)制 ——客戶與可連接對(duì)象的關(guān)系,兩個(gè)概念,入接口(incoming interface)組件對(duì)象實(shí)現(xiàn)入接口,客戶通過(guò)入接口調(diào)用對(duì)象提供的功能客戶和組件都需要知道接口的類型信息出接口(outgoing interface)客戶端提供的COM對(duì)象實(shí)現(xiàn)出接口組件端的對(duì)象通過(guò)出接口調(diào)用客戶提供的功能組件提供接口類型信息,客戶實(shí)現(xiàn)該接口類似于回調(diào)(callback),但是要復(fù)雜和靈活得多,出接口,類型信息

3、由組件一方提供客戶提供出接口的實(shí)現(xiàn),實(shí)現(xiàn)出接口的COM對(duì)象被稱為接收器對(duì)象(sink)sink沒(méi)有CLSID,也不需要類廠也是一個(gè)COM接口,有IID每個(gè)成員函數(shù)代表了:事件event通知notification請(qǐng)求request,源對(duì)象 or 可連接對(duì)象,Connectable object,source普通的COM對(duì)象,支持一個(gè)或者多個(gè)出接口提供出接口的類型信息通過(guò)IProvideClassInfo[2]接口通

4、過(guò)typelib,客戶與可連接對(duì)象之間的兩種結(jié)構(gòu),可連接對(duì)象的基本結(jié)構(gòu),可連接對(duì)象,如何管理多個(gè)出接口每個(gè)出接口對(duì)應(yīng)一個(gè)連接點(diǎn)對(duì)象通過(guò)連接點(diǎn)枚舉器管理對(duì)于每個(gè)出接口,如何管理多個(gè)客戶連接通過(guò)連接枚舉器管理多個(gè)連接,實(shí)現(xiàn)可連接對(duì)象(源對(duì)象)(一),枚舉器內(nèi)部對(duì)象,不需要類廠和CLSID其含義就如同指針——智能指針枚舉器接口模板class IEnum : public IUnknown{virtual HRESUL

5、T Next( ULONG celt, ELT_T *rgelt, ULONG *pceltFetched ) = 0;virtual HRESULT Skip( ULONG celt ) = 0;virtual HRESULT Reset( void ) = 0;virtual HRESULT Clone( IEnum**ppenum ) = 0;};,枚舉器的用法,class IStringManage

6、r : public IUnknown { virtual IEnumString* EnumStrings(void) = 0;};void SomeFunc(IStringManager * pStringMan){ String psz; IEnumString * penum; penum=pStringMan->EnumStrings(); while (S_OK == pen

7、um->Next(1, &psz, NULL)) { … //Do something with the string in psz and free it } penum->Release(); return;},實(shí)現(xiàn)可連接對(duì)象(源對(duì)象)(二),IConnectionPointContainer接口class IConnectionPointContainer : p

8、ublic IUnknown { virtual HRESULT EnumConnectionPoints(IEnumConnectionPoints **) = 0; virtual HRESULT FindConnectionPoint(const IID *, IConnectionPoint **) = 0;};IEnumConnectionPoints接口class IEnumConnectionPoints

9、: public IUnknown{virtual HRESULT Next( ULONG cConnections, IConnectionPoint **rgpcn, ULONG *pcFetched) = 0; virtual HRESULT Skip( ULONG cConnections) = 0;virtual HRESULT Reset(void) = 0;virtual HRESULT C

10、lone( IEnumConnectionPoints **ppEnum) = 0;};,實(shí)現(xiàn)可連接對(duì)象(源對(duì)象)(三),連接點(diǎn)和IConnectionPoint接口class IConnectionPoint : public IUnknown { virtual HRESULT GetConnectionInterface( IID *pIID) = 0; virtual HRESULT GetCo

11、nnectionPointContainer( IConnectionPointContainer **ppCPC) = 0; virtual HRESULT Advise( IUnknown *pUnk, DWORD *pdwCookie) = 0; virtual HRESULT Unadvise( DWORD dwCookie) = 0; virtual HRESULT EnumConne

12、ctions(IEnumConnections**ppEnum) = 0; };連接枚舉器 —— 實(shí)現(xiàn)IEnumConnections接口允許多個(gè)客戶連接每個(gè)連接用struct CONNECTDATA來(lái)描述,回顧:可連接對(duì)象的基本結(jié)構(gòu),客戶與源對(duì)象建立連接過(guò)程,客戶請(qǐng)求IConnectionPointContainer接口客戶調(diào)用IConnectionPointContainer::FindConnectionPoint找到連

13、接點(diǎn)對(duì)象客戶調(diào)用IConnectionPoint::Advise建立與接收器的連接最后,客戶調(diào)用IConnectionPoint::Unadvise取消連接,并釋放連接點(diǎn)對(duì)象,客戶方基本結(jié)構(gòu),客戶方實(shí)現(xiàn)接收器對(duì)象(sink)支持多個(gè)與可連接對(duì)象之間的連接一般只實(shí)現(xiàn)專用的出接口(IUnknown除外)不需要類廠、CLSID與客戶代碼緊密連接起來(lái)建立連接1 通過(guò)IConnectionPointContainer接口找到連接點(diǎn)

14、對(duì)象2 通過(guò)連接點(diǎn)對(duì)象建立連接連接點(diǎn)相當(dāng)于連接管理器,接收器的實(shí)現(xiàn),class CSomeEventSet : public ISomeEventSet { private: ULONG m_cRef; // Reference count ...... // other private data members public: DWOR

15、D m_dwCookie; // Connection key public: CSomeEventSet (); ~CSomeEventSet(void); //IUnknown members STDMETHODIMP QueryInterface(REFIID, PPVOID); STDMETHODIMP_(DWORD) Ad

16、dRef(void); STDMETHODIMP_(DWORD) Release(void); STDMETHODIMP SomeEventFunction ( ... ); ......};,接收器的用法,ISomeEventSet *gpSomeEventSet;.......// InitializeCSomeEventSet *pSink = new CSomeEven

17、tSet;pSink->QueryInterface(IID_ISomeEventSet, pSomeEventSet ); // Reference count is 1.......// connections the sink object to the connectable object we havehr=pConnectionPoint->Advise(pSomeEventSet , & pS

18、omeEventSet->m_dwCookie);....…// disconnections the sink object from the connectable object we havehr=pConnectionPoint->Unadvise( pSomeEventSet->m_dwCookie);.......// UninitializepSink->Release( ); //

19、Reference count is 0,事件的激發(fā)和處理,BOOL CSourceObject::FireSomeEvent(IConnctionPoint *pConnectionPoint){ IEnumConnections *pEnum; CONNECTDATA connectionData; if (FAILED(pConnectionPoint->EnumConnections

20、(&pEnum))) return FALSE; while (pEnum->Next(1, & connectionData, NULL) == NOERROR) { ISomeEventSet *pSomeEventSet; if (SUCCEEDED(connectionData.pUnk->QueryIn

21、terface(IID_ISomeEventSet, (PPVOID)& pSomeEventSet))) { pSomeEventSet->SomeEventFunction(); // Trigger event or request pSomeEventSet->Release(); } }

22、 pEnum->Release(); return TRUE;},與出接口有關(guān)的類型信息,客戶如何知道出接口?運(yùn)行時(shí)刻?編譯時(shí)刻?動(dòng)態(tài)構(gòu)造接收器對(duì)象?動(dòng)態(tài)構(gòu)造vtable?支持部分成員?類型信息的協(xié)商通過(guò)IProvideClassInfo[2]能否用標(biāo)準(zhǔn)的接口作為出接口?,用IDispatch接口作為出接口(一),IDispatch接口class IDispatch : public IUnknown{

23、 public: virtual HRESULT GetTypeInfoCount( UINT *pctinfo) = 0; virtual HRESULT GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) = 0; virtual HRESULT GetIDsOfNames(REFIID riid, LPOLEST

24、R *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) = 0; virtual HRESULT Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIA

25、NT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) = 0;};,用IDispatch接口作為出接口(二),IDispatch出接口的事件激發(fā)函數(shù),void CMySourceObj::FireMyMethod (short nInt){COleDispatchDriver driver;POSITION pos = m_xMyEventSet.GetStartPo

26、sition();LPDISPATCH pDispatch;while (pos != NULL) {pDispatch = (LPDISPATCH) m_xMyEventSet.GetNextConnection(pos);ASSERT(pDispatch != NULL);driver.AttachDispatch(pDispatch, FALSE);TRYdriver.InvokeHelpe

27、r(eventidMyMethod, DISPATCH_METHOD, VT_EMPTY, NULL,(BYTE *) (VTS_I2), nInt);END_TRYdriver.DetachDispatch();}},用連接點(diǎn)機(jī)制實(shí)現(xiàn)回調(diào)的討論,比傳統(tǒng)的回調(diào)函數(shù)功能強(qiáng)大,靈活可以跨進(jìn)程、跨機(jī)器Tightly coupled vs loosely coupled (COM+)要求客戶

28、與組件同步?jīng)]有第三方的參與,所以雙方必須保持共識(shí),MFC對(duì)連接和事件的支持,用MFC實(shí)現(xiàn)源對(duì)象,創(chuàng)建工程——支持COM定義出接口——編輯.odl文件利用MFC宏加入連接點(diǎn)聲明以及連接點(diǎn)對(duì)象的定義在對(duì)象構(gòu)造函數(shù)中調(diào)用EnableConnections();在接口映射表中加入接口IConnectionPointContainer的表項(xiàng),再加入連接映射表定義連接點(diǎn)類的虛函數(shù)(至少為GetIID)加入事件激發(fā)函數(shù),用MFC在客戶程

29、序中實(shí)現(xiàn)接收器,初始化 —— AfxOleInit定義出接口成員類實(shí)現(xiàn)出接口成員類創(chuàng)建源對(duì)象建立連接和取消連接完成可觸發(fā)事件的動(dòng)作,用MFC實(shí)現(xiàn)的例子,ATL實(shí)現(xiàn)可連接對(duì)象,在IDL中定義一個(gè)用作出接口的automation接口在coclass中加入出接口,含source屬性增加IConnectionPointContainer接口在基類列表中增加IConnectionPointConntainerImpl在CO

30、M MAP中加入COM_INTERFACE_ENTRY(IConnectionPointConntainer),模板類IConnectionPointImpl,CMyClass繼承IConnectionPointImpl一次或多次IConnectionPointImpl實(shí)現(xiàn)了獨(dú)立的引用計(jì)數(shù)用法:在基類列表中增加IConnectionPointImpl加入connection point map,如下BEGIN_CONNEC

31、TION_POINT_MAP(CMyClass)CONNECTION_POINT_ENTRY(DIID__IEventSet)END_CONNECTION_POINT_MAP(),激發(fā)事件輔助函數(shù),手工激發(fā)事件IConnectionPointImpl包含一個(gè)m_vec成員,內(nèi)含所有已經(jīng)建立的接收器連接遍歷m_vec數(shù)組,逐一調(diào)用Invoke函數(shù)利用VC IDE提供的源碼產(chǎn)生工具ATL連接點(diǎn)代理生成器,啟動(dòng)對(duì)話框Implem

32、ent Connection Point產(chǎn)生名為CProxy_的模板類例如CProxy_IEventSet,它從IConnectionPointImpl派生對(duì)于每一個(gè)事件或者請(qǐng)求,都有一個(gè)對(duì)應(yīng)的Fire_Xxx成員函數(shù)用模板類代替IConnectionPointImpl基類,Implement Connection Point對(duì)話框,創(chuàng)建對(duì)象時(shí)選擇Connection PointClassView中,在對(duì)象類上右鍵點(diǎn)擊選擇此項(xiàng)

33、功能,ATL實(shí)現(xiàn)連接點(diǎn):最后的工作,在需要激發(fā)事件的地方調(diào)用CProxy_提供的輔助函數(shù)增加對(duì)IProvideClassInfo2接口的支持需要typelib的支持加入基類IProvideClassInfo2Impl在COM MAP中加入:COM_INTERFACE_ENTRY(IProvideClassInfo2)COM_INTERFACE_ENTRY(IProvideClassInfo),ATL實(shí)現(xiàn)接收器sink,I

34、DispEventSimpleImpl輕量,不需要typelib的支持IDispEventImpl需要typelib的支持Event Sink MapBEGIN_SINK_MAP(CMyCLass)SINK_ENTRY_EX(...)// 適合用于non-UI objectSINK_ENTRY(...) // 適合用于UI objectEND_SINK_MAP,ATL:建立sink和source之間的連接,IDi

35、spEventSimpleImpl成員DispEventAdviseDispEventUnadviseAtlAdviseSinkMap建立sink與source缺省源接口的連接,VB中使用出接口,使用瀏覽器控件的事件函數(shù)使兩個(gè)窗口同步,結(jié)構(gòu)化存儲(chǔ)(structured storage),內(nèi)容:結(jié)構(gòu)化存儲(chǔ)模型復(fù)合文檔永久對(duì)象,問(wèn)題的由來(lái),文件系統(tǒng)的誕生多個(gè)應(yīng)用程序共享同一個(gè)存儲(chǔ)設(shè)備文件服務(wù)功能的抽象進(jìn)展到結(jié)構(gòu)化存儲(chǔ)

36、多個(gè)組件共享同一個(gè)文件組件軟件存儲(chǔ)功能的基本要求OLE的需求組件共享句柄方案,如何定位?避免沖突?,文件系統(tǒng)結(jié)構(gòu),結(jié)構(gòu)化存儲(chǔ),多個(gè)組件程序共享一個(gè)復(fù)合文件,復(fù)合文件,文件內(nèi)部的文件系統(tǒng)只有兩種對(duì)象:存儲(chǔ)對(duì)象和流對(duì)象實(shí)現(xiàn)了部分訪問(wèn)和增量訪問(wèn)的功能,流對(duì)象,COM庫(kù)提供實(shí)現(xiàn),實(shí)現(xiàn)了IStream接口class IStream : public IUnknown{public :virtual HRESULT Rea

37、d (void *pv, unsigned long cb, unsigned long *pcbRead) = 0;virtual HRESULT Write (void *pv, unsigned long cb, unsigned long *pcbWritten) = 0;virtual HRESULT Seek (LARGE_INTEGER dlibMove, unsigned long dwOrigin,UL

38、ARGE_INTEGER *plibNewPosition) = 0;virtual HRESULT SetSize (ULARGE_INTEGER libNewSize) = 0;virtual HRESULT CopyTo (LPSTREAM pStm, ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten) = 0;virtu

39、al HRESULT Commit (unsigned long dwCommitFlags) = 0;virtual HRESULT Revert ()= 0;virtual HRESULT LockRegion (ULARGE_INTEGER libOffset, ULARGE_INTEGER cb,unsigned long dwLockType) = 0;virtual HRESULT UnlockRegio

40、n (ULARGE_INTEGER libOffset, ULARGE_INTEGER cb,unsigned long dwLockType) = 0;virtual HRESULT Stat (STATSTG *pStatStg, unsigned long grfStatFlag) = 0;virtual HRESULT Clone(LPSTREAM * ppStm) = 0;};,存儲(chǔ)對(duì)象,COM庫(kù)提供實(shí)現(xiàn),實(shí)

41、現(xiàn)了IStorage接口class IStorage : public IUnknown{virtual HRESULT CreateStream (const WCHAR * , unsigned long , LPSTREAM * ) = 0;virtual HRESULT OpenStream (const WCHAR * , unsigned long , LPSTREAM * ) = 0;virtual HRE

42、SULT CreateStorage (const WCHAR * , unsigned long ,LPSTORAGE * ) = 0; virtual HRESULT OpenStorage (const WCHAR* , LPSTORAGE *, unsigned long , SNB , unsigned long , LPSTORAGE * ) = 0;virtual HRESULT CopyTo(unsi

43、gned long , IID const *, SNB snbExclude, LPSTORAGE * pStgDest) = 0;virtual HRESULT MoveElementTo(const WCHAR * , LPSTORAGE *,char const * , unsigned long ) = 0;virtual HRESULT Commit (unsigned long ) = 0;virtual H

44、RESULT Revert ()= 0;virtual HRESULT EnumElements (unsigned long , void *,unsigned long , LPENUMSTATSTG * ) = 0;virtual HRESULT DestroyElement (const WCHAR * pwcsName) = 0;virtual HRESULT RenameElement (const WCHAR

45、* pwcsOldName, const WCHAR * pwcsNewName) = 0;virtual HRESULT SetElementTimes(const WCHAR *,FILETIME const *,FILETIME const*,FILETIME const *) = 0;virtual HRESULT SetClass (REFCLSID rclsid) = 0;virtual HRESUL

46、T SetStateBits (unsigned long grfStateBits, unsigned long grfMask) = 0;virtual HRESULT Stat (STATSTG *pStatStg, unsigned long grfStatFlag) = 0;};,客戶如何獲取存儲(chǔ)對(duì)象和流對(duì)象,如何得到指向根存儲(chǔ)對(duì)象的接口指針?CreateStorage和OpenStorage成員函數(shù)得到一個(gè)子存儲(chǔ)對(duì)

47、象,是唯一的途徑CreateStream和OpenStream成員函數(shù)得到一個(gè)流對(duì)象,也是唯一的途徑,用結(jié)構(gòu)化存儲(chǔ)設(shè)計(jì)應(yīng)用(一),用普通文件組織的文檔結(jié)構(gòu),用結(jié)構(gòu)化存儲(chǔ)設(shè)計(jì)應(yīng)用(二),復(fù)合文件格式的文檔結(jié)構(gòu),結(jié)構(gòu)化存儲(chǔ)特性——訪問(wèn)模式,STGM_CREATESTGM_CONVERTSTGM_FAILIFTHERESTGM_DELETEONRELEASESTGM_DIRECTSTGM_TRANSACTEDSTGM_PRIO

48、RITYSTGM_READSTGM_WRITESTGM_READWRITESTGM_SHARE_DENY_READSTGM_SHARE_DENY_WRITESTGM_SHARE_EXCLUSIVESTGM_SHARE_DENY_NONE,結(jié)構(gòu)化存儲(chǔ)特性——事務(wù)機(jī)制,數(shù)據(jù)一致性和完整性操作:Commit、Revert事務(wù)嵌套:以STGM_TRANSACTED標(biāo)志為基礎(chǔ)事務(wù)機(jī)制需要消耗較多系統(tǒng)資源Commit參數(shù):S

49、TGC_DEFAULTSTGC_OVERWRITESTGC_ONLYIFCURRENTSTGC_DANGEROUSLYCOMMITMERELYTODISKCACHE,結(jié)構(gòu)化存儲(chǔ)特性——命名規(guī)則,根存儲(chǔ)對(duì)象的名字遵守文件系統(tǒng)的命名約定長(zhǎng)度不超過(guò)32個(gè)字符首字符使用大于32的字符,小于32的字符作為首字符有特殊意義不能使用字符“\”、“/”、“:”和“!”名字“.”和“..”被保留名字保留大小寫(xiě),但比較操作大小寫(xiě)無(wú)關(guān),結(jié)構(gòu)化

50、存儲(chǔ)特性——增量訪問(wèn),減少保存和打開(kāi)文件的時(shí)間降低了應(yīng)用程序?qū)ο到y(tǒng)資源的要求問(wèn)題:通過(guò)根存儲(chǔ)逐層找到目標(biāo)對(duì)象空間回收,復(fù)合文檔,結(jié)構(gòu)化存儲(chǔ)的具體實(shí)現(xiàn)底層機(jī)制:LockBytes對(duì)象把存儲(chǔ)介質(zhì)描述成一般化的字節(jié)序列復(fù)合文檔API函數(shù)零內(nèi)存保存特性,復(fù)合文檔模型,,root,,,,,,,,,,,,,LockBytes對(duì)象,ILockBytes接口class ILockBytes : public IUnknown

51、{public :virtual HRESULT ReadAt (ULARGE_INTEGER , VOID *pv, unsigned long ,unsigned long *) = 0;virtual HRESULT WriteAt (ULARGE_INTEGER , VOID *pv, unsigned long ,unsigned long *) = 0; virtual HRESULT Fl

52、ush ()= 0;virtual HRESULT SetSize (ULARGE_INTEGER cb) = 0;virtual HRESULT LockRegion (ULARGE_INTEGER , ULARGE_INTEGER ,unsigned long ) = 0;virtual HRESULT UnlockRegion (ULARGE_INTEGER , ULARGE_INTEGER ,unsi

53、gned long ) = 0;virtual HRESULT Stat (STATSTG *, unsigned long ) = 0;};,復(fù)合文檔API函數(shù),創(chuàng)建復(fù)合文檔的API函數(shù)StgCreateDocfile、StgCreateDocfileOnILockBytes打開(kāi)復(fù)合文檔的API函數(shù)StgOpenStorage、StgOpenStorageOnILockBytes與內(nèi)存句柄有關(guān)的一組操作函數(shù)Crea

54、teILockBytesOnHGlobal、GetHGlobalFromILockBytesCreateStreamOnHGlobal、GetHGlobalFromStream其他,零內(nèi)存保存特性,意義:資源耗盡之后,保留修改信息資源預(yù)留,對(duì)于所有的流對(duì)象和存儲(chǔ)對(duì)象“Save”操作,只要調(diào)用Commit函數(shù)即可“Save As”操作,利用根存儲(chǔ)對(duì)象上的IRootStorage接口,調(diào)用SwitchToFile成員函數(shù),

55、再調(diào)用Commit函數(shù)即可。,與CLSID的聯(lián)系,IStorage::SetClass函數(shù)把存儲(chǔ)對(duì)象與CLSID聯(lián)系起來(lái)GetClassFile函數(shù),從文件到CLSID:復(fù)合文件,直接得到根存儲(chǔ)的CLSID非復(fù)合文件:(1) 文件擴(kuò)展名-〉ProgID-〉CLSID(2) HKEY_CLASSES_ROOT\FileType鍵提供了匹配規(guī)則:HKEY_CLASSES_ROOT FileTyp

56、e {} = ,,, = ,,,,復(fù)合文檔與COM的關(guān)系,復(fù)合文檔技術(shù)以COM為基礎(chǔ)應(yīng)用程序在處理復(fù)合文檔時(shí)把storage或stream直接交給COM組件來(lái)處理COM組件接受storage或stream作為數(shù)據(jù)存儲(chǔ)多個(gè)組件協(xié)同處理同一個(gè)文件->永久對(duì)象,永久對(duì)象,永久對(duì)象實(shí)現(xiàn)了IPersistXXX接口的COM對(duì)象永久接口:

57、class IPersist : public IUnknownclass IPersistStream : public IPersistclass IPersistStreamInit : public IPersistclass IPersistFile : public IPersistclass IPersistStorage : public Ipersist永久接口的成員函數(shù):GetClassID、IsDirt

溫馨提示

  • 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ù)僅提供信息存儲(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)論