畢業(yè)設(shè)計(jì)-WORD試題庫(kù)工具插件的設(shè)計(jì)-論文_第1頁(yè)
畢業(yè)設(shè)計(jì)-WORD試題庫(kù)工具插件的設(shè)計(jì)-論文_第2頁(yè)
畢業(yè)設(shè)計(jì)-WORD試題庫(kù)工具插件的設(shè)計(jì)-論文_第3頁(yè)
畢業(yè)設(shè)計(jì)-WORD試題庫(kù)工具插件的設(shè)計(jì)-論文_第4頁(yè)
畢業(yè)設(shè)計(jì)-WORD試題庫(kù)工具插件的設(shè)計(jì)-論文_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、畢業(yè)設(shè)計(jì)(論文)word試題庫(kù)工具插件的設(shè)計(jì)論文作者姓名:申請(qǐng)學(xué)位專業(yè):申請(qǐng)學(xué)位類別:指導(dǎo)教師姓名(職稱):論文提交日期:word試題庫(kù)工具插件的設(shè)計(jì)摘 要編寫試題、排版試卷一直以來都是一項(xiàng)繁重的工作。手工錄入試題然后排版試卷工作量大且容易出錯(cuò),試題的收集保存也是以文件的形式,這使得查找試題變得相當(dāng)困難。改用數(shù)據(jù)庫(kù)存儲(chǔ)試題將使試題的存儲(chǔ)和查找得到優(yōu)化,這是大部分試題庫(kù)軟件的優(yōu)勢(shì),但是這些試題庫(kù)軟件都使用軟件自身的文本編輯器,功能十分有限,在數(shù)據(jù)的存儲(chǔ)方面也只能存儲(chǔ)純文本的試題,不能存儲(chǔ)圖片、表格等。這使得用戶在編輯試題時(shí)十分不便,在數(shù)據(jù)的存儲(chǔ)方面也有很大限制。如果結(jié)合數(shù)據(jù)庫(kù)的存儲(chǔ)功能、結(jié)構(gòu)化查

2、詢語言的查詢功能和word的文本編輯功能,利用word進(jìn)行試題編寫、試卷排版,利用數(shù)據(jù)庫(kù)存儲(chǔ)試題,利用結(jié)構(gòu)化查詢語言查找試題、過濾顯示同類試題,那么編寫試題、排版試卷等工作將變得方便快捷。為了實(shí)現(xiàn)word與數(shù)據(jù)庫(kù)之間的試題存取(能夠支持圖片、表格、公式的存取)以及其他一些功能編寫的word試題庫(kù)工具插件以com組件的形式嵌入word程序中,通過它將word與試題數(shù)據(jù)庫(kù)有效的結(jié)合到一起,使用戶既能夠方便的編輯試題又能夠?qū)⒃囶}存入數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)中取出,還能夠通過結(jié)構(gòu)化查詢語句搜索試題。關(guān)鍵詞:com組件;word 插件;二進(jìn)制字段;結(jié)構(gòu)化查詢語言the design of an msword a

3、ddin for the test question bankabstractediting test questions and typesetting examination papers is always an arduous work, which is tedious and easy to make mistake. besides, the collection of the test questions is in the form of files that makes it difficult to search proper test questions. using

4、the database to store test questions can improve the searching function for the test questions, but such softwares almost use their own text editors with limited format control functions. at the aspect of their storage form, they commonly only save test questions in plain text, which means they can

5、hardly store the pictures or tables that may be nesscesary in the test question. considering that large part of test questions are edited in msword, if we can utilize the powerful format control function combined with the binary data storage function of the database to provide a localized test quest

6、ion management tool, the work of editing test questions and typesetting examination papers would become more effective and convinent. with the help of com component technology, such a tool can be implemented in the form of word addin that can integrate msword and the test question bank seamlessly an

7、d facilitate the users to store the test question into the bank and retrieve test questions selectively by the structural query language (sql).key words: com; word addin; binary field; sql目 錄論文總頁(yè)數(shù):33頁(yè)1 引言11.1 課題背景11.2 國(guó)內(nèi)外研究現(xiàn)狀11.3 本課題研究的意義12 理論基礎(chǔ)12.1 com組件技術(shù)12.1.1 什么是com組件12.1.2 com組件的基本元素22.1.3 關(guān)鍵接口

8、32.1.4 如何創(chuàng)建com對(duì)象42.1.5 如何刪除com對(duì)象52.2 word對(duì)象模型62.2.1 什么是word對(duì)象模型62.2.2 word對(duì)象模型抽象圖62.2.3 主要對(duì)象模型介紹72.3 數(shù)據(jù)庫(kù)技術(shù)72.4 odl文件語法82.4.1 odl文件語法結(jié)構(gòu)82.4.2 類型庫(kù)tlb的使用方法102.5 ado技術(shù)112.5.1 什么是ado技術(shù)112.5.2 如何在vb中使用ado122.5.3 ado技術(shù)主要應(yīng)用舉例152.6 插件技術(shù)202.6.1 什么是插件202.6.2 主流插件簡(jiǎn)介203 需求分析與方案設(shè)計(jì)213.1 什么是word試題庫(kù)工具插件213.2 word試題庫(kù)

9、工具插件的功能需求分析213.2.1 創(chuàng)建題庫(kù)功能223.2.2 打開試題庫(kù)功能223.2.3 存儲(chǔ)試題功能223.2.4 提取試題功能223.2.5 刪除試題功能223.2.6 預(yù)覽試題功能223.2.7 搜索試題功能223.2.8 過濾試題功能233.3 word試題庫(kù)工具插件的結(jié)構(gòu)設(shè)計(jì)233.3.1 數(shù)據(jù)庫(kù)結(jié)構(gòu)233.3.2 主程序結(jié)構(gòu)234 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)234.1 已實(shí)現(xiàn)的功能234.2 在word中添加按鈕的實(shí)現(xiàn)過程244.2.1 實(shí)現(xiàn)原理244.2.2 關(guān)鍵代碼244.2.3 相關(guān)技術(shù)的運(yùn)用254.3 試題存儲(chǔ)的實(shí)現(xiàn)過程254.3.1 實(shí)現(xiàn)原理254.3.2 關(guān)鍵代碼264.3.

10、3 相關(guān)技術(shù)的運(yùn)用274.4 試題提取的實(shí)現(xiàn)過程284.4.1 實(shí)現(xiàn)原理284.4.2 關(guān)鍵代碼284.4.3 相關(guān)技術(shù)的運(yùn)用305 測(cè)試和分析30結(jié) 論30參考文獻(xiàn)31致 謝32聲 明331引言1.1課題背景目前大量試題使用word編寫,在word中可以很方便地編寫公式、插入圖片和表格。一些獨(dú)立的試題庫(kù)軟件使用簡(jiǎn)單的文本編輯功能,在試題編輯方面沒有word方便。但是word僅能編輯試題,不能存儲(chǔ)收集試題。word試題庫(kù)工具插件以com組件的形式嵌入word程序中,通過它將word與數(shù)據(jù)庫(kù)有效的結(jié)合到一起,從而使用戶既能夠方便的編輯試題又能夠?qū)⒃囶}存入數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)中取出。1.2國(guó)內(nèi)外研究現(xiàn)

11、狀大多數(shù)試題庫(kù)軟件都使用軟件自身的文本編輯器,功能十分有限;在數(shù)據(jù)的存儲(chǔ)方面只能存儲(chǔ)純文本的試題,不能存儲(chǔ)圖片、表格等,這使得用戶在編輯試題時(shí)十分不便,在數(shù)據(jù)的存儲(chǔ)方面也有很大限制。1.3本課題研究的意義通過綜合運(yùn)用com組件技術(shù)、插件技術(shù)、數(shù)據(jù)庫(kù)技術(shù)開發(fā)的word試題庫(kù)工具插件能嵌入word程序內(nèi),從而將word與數(shù)據(jù)庫(kù)有效的結(jié)合到一起。使用戶在編輯試題時(shí)既能用word方便快捷的編輯試題又能方便的將試題存入數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)提取試題。使試題編輯工作更加方便快捷。2理論基礎(chǔ)2.1 com組件技術(shù)2.1.1什么是com組件com 即組件對(duì)象模型,是component object model的縮寫

12、。com 是一種跨應(yīng)用和語言共享二進(jìn)制代碼的方法。與c+不同,它提倡源代碼重用。atl 便是一個(gè)很好的例證。源碼級(jí)重用雖然好,但只能用于c+。它還帶來了名字沖突的可能性,更不用說不斷拷貝重用代碼而導(dǎo)致工程膨脹和臃腫。windows 使用dlls 在二進(jìn)制級(jí)共享代碼。這也是windows 程序運(yùn)行的關(guān)鍵重用kernel32.dll, user32.dll 等。但dlls 是針對(duì)c 接口而寫的,它們只能被c 或理解c 調(diào)用規(guī)范的語言使用。由編程語言來負(fù)責(zé)實(shí)現(xiàn)共享代碼,而不是由dlls 本身。這樣的話dlls 的使用受到限制。mfc 引入了另外一種mfc 擴(kuò)展dlls 二進(jìn)制共享機(jī)制。但它的使用仍受

13、限制只能在mfc 程序中使用。com 通過定義二進(jìn)制標(biāo)準(zhǔn)解決了這些問題,即com 明確指出二進(jìn)制模塊(dlls 和exes)必須被編譯成與指定的結(jié)構(gòu)匹配。這個(gè)標(biāo)準(zhǔn)也確切規(guī)定了在內(nèi)存中如何組織com 對(duì)象。com 定義的二進(jìn)制標(biāo)準(zhǔn)還必須獨(dú)立于任何編程語言(如c+中的命名修飾)。一旦滿足了這些條件,就可以輕松地從任何編程語言中存取這些模塊。由編譯器負(fù)責(zé)所產(chǎn)生的二進(jìn)制代碼與標(biāo)準(zhǔn)兼容。這樣使后來的人就能更容易地使用這些二進(jìn)制代碼。在內(nèi)存中,com 對(duì)象的這種標(biāo)準(zhǔn)形式在c+虛函數(shù)中偶爾用到,所以這就是為什么許多com 代碼使用c+的原因。但是記住,編寫模塊所用的語言是無關(guān)的,因?yàn)榻Y(jié)果二進(jìn)制代碼為所有語言

14、可用。2.1.2 com組件的基本元素coclass(簡(jiǎn)稱組件對(duì)象類component object class)被包含在dll 或exe 中,并且包含著一個(gè)或者多個(gè)接口的代碼。組件對(duì)象類(coclasss)實(shí)現(xiàn)這些接口。com 對(duì)象在內(nèi)存中表現(xiàn)為組件對(duì)象類(coclasss)的一個(gè)實(shí)例。注意com“類”和c+“類”是不相同的,盡管常常com 類實(shí)現(xiàn)的就是一個(gè)c+類。com 服務(wù)器是包含了一個(gè)或多個(gè)coclass 的二進(jìn)制dll 或exe。注冊(cè)(registration)是創(chuàng)建注冊(cè)表入口的一個(gè)過程,告訴windows 操作系統(tǒng)com 服務(wù)器放在什么位置。取消注冊(cè)(unregistration)

15、則相反從注冊(cè)表刪除這些注冊(cè)入口。guid(諧音為“fluid”,意思是全球唯一標(biāo)示符globally unique identifier)是個(gè)128 位的數(shù)字。它是一種獨(dú)立于com 編程語言的標(biāo)示方法。每一個(gè)接口和coclass 有一個(gè)guid。因?yàn)槊恳粋€(gè)guid 都是全球唯一的,所以避免了名字沖突(只要用com api 創(chuàng)建它們)。有時(shí)還會(huì)碰到另一個(gè)術(shù)語uuid(意思也是全球唯一標(biāo)示符universally iqueidentifier)。uuids 和guids 在實(shí)際使用時(shí)的用途是一樣的。類id 或者clsid 是命名coclass 的guid。接口id 或者iid 是命名接口的guid

16、。在com 中廣泛地使用guid 有兩個(gè)理由:1、guids 只是簡(jiǎn)單的數(shù)字,任何編程語言都可以對(duì)之進(jìn)行處理。2、guids 可以在任何機(jī)器上被任何人創(chuàng)建,一旦完成創(chuàng)建,它就是唯一的。因此,com開發(fā)人員可以創(chuàng)建自己特有的guids 而不會(huì)與其它開發(fā)人員所創(chuàng)建的guids 有沖突。這樣就消除了集中授權(quán)發(fā)布guids 的必要。hresult 是com 用來返回錯(cuò)誤和成功代碼的整型數(shù)字。除此之外,別無它意,雖然以h作前綴,但沒有句柄之意。最后,com 庫(kù)是在使用com 時(shí)與交互的操作系統(tǒng)的一部分,它常常指的就是com 本身。但是為了避免混淆才分開描述的。使用和處理com 對(duì)象每一種語言都有其自己處

17、理對(duì)象的方式。例如,c+是在棧中創(chuàng)建對(duì)象,或者用new 動(dòng)態(tài)分配。因?yàn)閏om 必須獨(dú)立于語言,所以com 庫(kù)為自己提供對(duì)象管理例程。下面是對(duì)com對(duì)象管理和c+對(duì)象管理所做的一個(gè)比較:創(chuàng)建一個(gè)新對(duì)象c+中,用new 操作符,或者在棧中創(chuàng)建對(duì)象。com 中,調(diào)用com 庫(kù)中的api。刪除對(duì)象c+中,用delete 操作符,或?qū)?duì)象踢出。com 中,所有的對(duì)象保持它們自己的引用計(jì)數(shù)。調(diào)用者必須通知對(duì)象什么時(shí)候用完這個(gè)對(duì)象。當(dāng)引用計(jì)數(shù)為零時(shí),com 對(duì)象將自己從內(nèi)存中釋放。由此可見,對(duì)象處理的兩個(gè)階段:創(chuàng)建和銷毀,缺一不可。當(dāng)創(chuàng)建com 對(duì)象時(shí)要通知com庫(kù)使用哪一個(gè)接口。如果這個(gè)對(duì)象創(chuàng)建成功,c

18、om 庫(kù)返回所請(qǐng)求接口的指針。然后通過這個(gè)指針調(diào)用方法,就像使用常規(guī)c+對(duì)象指針一樣。2.1.3關(guān)鍵接口iunknown接口每一個(gè)com 接口都派生于iunknown。這個(gè)名字有點(diǎn)誤導(dǎo)人,其中沒有未知(unknown)接口的意思。它的原意是如果有一個(gè)指向某com 對(duì)象的iunknown 指針,就不用知道潛在的對(duì)象是什么,因?yàn)槊總€(gè)com 對(duì)象都實(shí)現(xiàn)iunknown。iunknown 有三個(gè)方法:addref() 通知com 對(duì)象增加它的引用計(jì)數(shù)。如果你進(jìn)行了一次接口指針的拷貝,就必須調(diào)用一次這個(gè)方法,并且原始的值和拷貝的值兩者都要用到。在本文的例子中沒有用到addref()方法。release(

19、) 通知com 對(duì)象減少它的引用計(jì)數(shù)。參見前面的release()示例代碼段。queryinterface() 從com 對(duì)象請(qǐng)求一個(gè)接口指針。當(dāng)coclass 實(shí)現(xiàn)一個(gè)以上的接口時(shí),就要用到這個(gè)方法。iclassfactory接口iclassfactory 的作用是創(chuàng)建com 組件。創(chuàng)建組件的責(zé)任交給了一個(gè)單獨(dú)的對(duì)象,這個(gè)對(duì)象就是類廠。每個(gè)組件都必須有一個(gè)與之相關(guān)的類廠,這個(gè)類廠知道怎么樣創(chuàng)建組件,當(dāng)客戶請(qǐng)求一個(gè)組件對(duì)象的實(shí)例時(shí),實(shí)際上這個(gè)請(qǐng)求交給了類廠,由類廠創(chuàng)建組件實(shí)例,然后把實(shí)例指針交給客戶程序。這個(gè)過程在跨進(jìn)程及遠(yuǎn)程創(chuàng)建組件時(shí)特別有用,因?yàn)檫@時(shí)就不是一個(gè)簡(jiǎn)單的new 操作就可以的了,

20、它必須要經(jīng)過調(diào)度,而這些復(fù)雜的操作都交給類廠對(duì)象去做了。iclassfactory 最重要的一個(gè)函數(shù)就是createinstance,顧名思議就是創(chuàng)建組件實(shí)例,一般情況下我們不會(huì)直接調(diào)用它,api 函數(shù)都為我們封裝好它了,只有某些特殊情況下才會(huì)由我們自己來調(diào)用它。idispatch接口idispatch 叫做調(diào)度接口。調(diào)度接口把每一個(gè)函數(shù)每一個(gè)屬性都編上號(hào),客戶程序要調(diào)用這些函數(shù)屬性的時(shí)侯就把這些編號(hào)傳給idispatch 接口就行了,idispatch 再根據(jù)這些編號(hào)調(diào)用相應(yīng)的函數(shù)。idispatch 接口的主要函數(shù)是invoke,客戶程序都調(diào)用它,然后invoke 再調(diào)用相應(yīng)的函數(shù)。2.1

21、.4如何創(chuàng)建com對(duì)象為了創(chuàng)建com 對(duì)象并從這個(gè)對(duì)象獲得接口, 必須調(diào)用com 庫(kù)的api 函數(shù),cocreateinstance()。其原型如下:hresult cocreateinstance (refclsid rclsid,lpunknown punkouter,dword dwclscontext,refiid riid,lpvoid* ppv );以下是參數(shù)解釋:rclsidcoclass 的clsid,例如,可以傳遞clsid_shelllink 創(chuàng)建一個(gè)com 對(duì)象來建立快捷方式。punkouter這個(gè)參數(shù)只用于com 對(duì)象的聚合,利用它向現(xiàn)有的coclass 添加新方法。參

22、數(shù)值為null 表示不使用聚合。dwclscontext表示所使用com 服務(wù)器的種類。本文使用的是最簡(jiǎn)單的com 服務(wù)器,一個(gè)進(jìn)程內(nèi)(in-process)dll,所以傳遞的參數(shù)值為clsctx_inproc_server。注意這里不要隨意使用clsctx_all(在atl 中,它是個(gè)缺省值),因?yàn)樵跊]有安裝dcom 的windows95系統(tǒng)上會(huì)導(dǎo)致失敗。riid請(qǐng)求接口的iid。例如,可以傳遞iid_ishelllink 獲得ishelllink 接口指針。ppv接口指針的地址。com 庫(kù)通過這個(gè)參數(shù)返回請(qǐng)求的接口。當(dāng)調(diào)用cocreateinstance()時(shí),它負(fù)責(zé)在注冊(cè)表中查找com

23、服務(wù)器的位置,將服務(wù)器加載到內(nèi)存,并創(chuàng)建所請(qǐng)求的coclass 實(shí)例。以下是一個(gè)調(diào)用的例子,創(chuàng)建一個(gè)clsid_shelllink 對(duì)象的實(shí)例并請(qǐng)求指向這個(gè)對(duì)象ishelllink 接口指針。hresult hr;ishelllink* pisl;hr = cocreateinstance ( clsid_shelllink, / coclass 的clsidnull, / 不是用聚合clsctx_inproc_server, / 服務(wù)器類型iid_ishelllink, / 接口的iid(void*) &pisl ); / 指向接口的指針if ( succeeded ( hr ) )/ 用p

24、isl 調(diào)用方法else/ 不能創(chuàng)建com 對(duì)象,hr 為出錯(cuò)代碼首先聲明一個(gè)接受cocreateinstance()返回值的hresult 和ishelllink 指針。調(diào)用cocreateinstance()來創(chuàng)建新的com 對(duì)象。如果hr 接受到一個(gè)表示成功的代碼,則succeeded 宏返回true,否則返回false。failed 是一個(gè)與succeeded 對(duì)應(yīng)的宏用來檢查失敗代碼。2.1.5如何刪除com對(duì)象前面說過,不用釋放com 對(duì)象,只要告訴它們已經(jīng)用完對(duì)象。iunknown 是每一個(gè)com對(duì)象必須實(shí)現(xiàn)的接口,它有一個(gè)方法,release()。調(diào)用這個(gè)方法通知com 對(duì)象不

25、再需要對(duì)象。一旦調(diào)用了這個(gè)方法之后,就不能再次使用這個(gè)接口,因?yàn)檫@個(gè)com 對(duì)象可能從此就從內(nèi)存中消失了。如果的應(yīng)用程序使用許多不同的com 對(duì)象,因此在用完某個(gè)接口后調(diào)用release()就顯得非常重要。如果不釋放接口,這個(gè)com 對(duì)象(包含代碼的dlls)將保留在內(nèi)存中,這會(huì)增加不必要的開銷。如果的應(yīng)用程序要長(zhǎng)時(shí)間運(yùn)行,就應(yīng)該在應(yīng)用程序處于空閑期間調(diào)用cofreeunusedlibraries() api。這個(gè)api 將卸載任何沒有明顯引用的com 服務(wù)器,因此這也降低了應(yīng)用程序使用的內(nèi)存開銷。繼續(xù)用上面的例子來說明如何使用release():/ 像上面一樣創(chuàng)建com 對(duì)象, 然后,if

26、( succeeded ( hr ) )/ 用pisl 調(diào)用方法/ 通知com 對(duì)象不再使用它pisl-release();2.2 word對(duì)象模型2.2.1什么是word對(duì)象模型microsoft office word 2003 對(duì)象是按層次順序排列的,層次結(jié)構(gòu)頂端的兩個(gè)主類是 application 類和 document 類。這兩個(gè)類非常重要,因?yàn)樵诖蟛糠謺r(shí)間里,您要么是在使用 word 應(yīng)用程序本身,要么是以某種方式處理 word 文檔。word 對(duì)象模型嚴(yán)格遵循用戶界面。application 對(duì)象提供整個(gè)應(yīng)用程序的包裝,每個(gè) document 對(duì)象表示單個(gè) word 文檔,par

27、agraph 對(duì)象對(duì)應(yīng)單個(gè)段落,等等。這些對(duì)象各自都有很多方法和屬性,您可以使用這些方法和屬性操作對(duì)象或與對(duì)象交互。當(dāng)您在 visual studio .net 中創(chuàng)建新的 word 項(xiàng)目時(shí),可以選擇創(chuàng)建新的 word document 項(xiàng)目或 word template 項(xiàng)目。visual studio .net 在新的 word 項(xiàng)目中自動(dòng)為 document 項(xiàng)目和 template 項(xiàng)目創(chuàng)建 thisdocument.vb 或 thisdocument.cs 代碼文件。thisdocument 文件包含一個(gè)名為 officecodebehind 的公共類。officecodebehin

28、d 類包含包裝 word.document 對(duì)象和 word.application 對(duì)象的代碼。這兩個(gè)變量是 officecodebehind 類的成員: thisdocument允許訪問 word 中的所有內(nèi)置 document 成員,包括方法、屬性及事件。 thisapplication訪問 application 對(duì)象的所有成員,包括事件。這樣,只需要使用 thisdocument 和 thisapplication,就可以輕松訪問代碼中的對(duì)象;而不必分別聲明 word.document 或 word.application 對(duì)象。注意生成的項(xiàng)目模板代碼使用類型轉(zhuǎn)換,因?yàn)樵S多 word

29、 方法和屬性都返回 object 類型。例如,給 _startup 過程傳遞的是對(duì)象類型形式的名為 application 和 document 的變量,轉(zhuǎn)換函數(shù)用于分別將每個(gè)變量顯式轉(zhuǎn)換為 word.application 和 word.document 對(duì)象。2.2.2 word對(duì)象模型抽象圖圖1:word對(duì)象模型2.2.3主要對(duì)象模型介紹1、application 對(duì)象application 對(duì)象表示 word 應(yīng)用程序,是其他所有對(duì)象的父級(jí)。它的所有成員通常作為一個(gè)整體應(yīng)用于 word。可以使用該對(duì)象的屬性和方法來控制 word 環(huán)境。有關(guān)更多信息,請(qǐng)參見 word 的 applica

30、tion 對(duì)象。2、document 對(duì)象document 對(duì)象是 word 編程的中樞。當(dāng)您打開文檔或創(chuàng)建新文檔時(shí),就創(chuàng)建了新的 document 對(duì)象,該對(duì)象被添加到 word 的 documents 集合中。焦點(diǎn)所在的文檔叫做活動(dòng)文檔,由 application 對(duì)象的 activedocument 屬性表示。有關(guān)更多信息,請(qǐng)參見 word 的 document 對(duì)象。3、selection 對(duì)象selection 對(duì)象表示當(dāng)前選擇的區(qū)域。在 word 用戶界面中執(zhí)行某項(xiàng)操作(例如,對(duì)文本進(jìn)行加粗)時(shí),應(yīng)首先選擇或突出顯示文本,然后應(yīng)用格式設(shè)置。selection 對(duì)象始終存在于文檔中。

31、如果未選中任何對(duì)象,它表示插入點(diǎn)。此外,該對(duì)象還可以表示多個(gè)不連續(xù)的文本塊。有關(guān)更多信息,請(qǐng)參見 word 的 selection 對(duì)象。4、range 對(duì)象range 對(duì)象表示文檔中的一個(gè)連續(xù)的區(qū)域,由一個(gè)起始字符位置和一個(gè)結(jié)束字符位置定義。range 對(duì)象的數(shù)量并不局限于一個(gè)。您可以在同一文檔中定義多個(gè) range 對(duì)象。range 對(duì)象具有以下特性:它的組成成分可以是單獨(dú)的插入點(diǎn),也可以是一個(gè)文本范圍或整個(gè)文檔;它包含非打印字符,例如空格、制表符和段落標(biāo)記;它可以是當(dāng)前選擇所表示的區(qū)域,也可以表示當(dāng)前選擇之外的區(qū)域;它不隨文檔保存,僅存在于代碼運(yùn)行期間。在向一個(gè)范圍的末尾插入文本時(shí),wo

32、rd 會(huì)自動(dòng)擴(kuò)展該范圍以包含插入的文本。有關(guān)更多信息,請(qǐng)參見 word 的 range 對(duì)象。2.3數(shù)據(jù)庫(kù)技術(shù)數(shù)據(jù)庫(kù)是依照某種數(shù)據(jù)模型組織起來并存放二級(jí)存儲(chǔ)器中的數(shù)據(jù)集合。這種數(shù)據(jù)集合具有如下特點(diǎn):盡可能不重復(fù),以最優(yōu)方式為某個(gè)特定組織的多種應(yīng)用服務(wù),其數(shù)據(jù)結(jié)構(gòu)獨(dú)立于使用它的應(yīng)用程序,對(duì)數(shù)據(jù)的增、刪、改和檢索由統(tǒng)一軟件進(jìn)行管理和控制。從發(fā)展的歷史看,數(shù)據(jù)庫(kù)是數(shù)據(jù)管理的高級(jí)階段,它是由文件管理系統(tǒng)發(fā)展起來的。數(shù)據(jù)庫(kù)的基本結(jié)構(gòu)分三個(gè)層次,反映了觀察數(shù)據(jù)庫(kù)的三種不同角度。 (1)物理數(shù)據(jù)層。它是數(shù)據(jù)庫(kù)的最內(nèi)層,是物理存貯設(shè)備上實(shí)際存儲(chǔ)的數(shù)據(jù)的集合。這些數(shù)據(jù)是原始數(shù)據(jù),是用戶加工的對(duì)象,由內(nèi)部模式描述

33、的指令操作處理的位串、字符和字組成。(2)概念數(shù)據(jù)層。它是數(shù)據(jù)庫(kù)的中間一層,是數(shù)據(jù)庫(kù)的整體邏輯表示。指出了每個(gè)數(shù)據(jù)的邏輯定義及數(shù)據(jù)間的邏輯聯(lián)系,是存貯記錄的集合。它所涉及的是數(shù)據(jù)庫(kù)所有對(duì)象的邏輯關(guān)系,而不是它們的物理情況,是數(shù)據(jù)庫(kù)管理員概念下的數(shù)據(jù)庫(kù)。(3)邏輯數(shù)據(jù)層。它是用戶所看到和使用的數(shù)據(jù)庫(kù),表示了一個(gè)或一些特定用戶使用的數(shù)據(jù)集合,即邏輯記錄的集合。數(shù)據(jù)庫(kù)不同層次之間的聯(lián)系是通過映射進(jìn)行轉(zhuǎn)換的。數(shù)據(jù)庫(kù)具有以下主要特點(diǎn):(1)實(shí)現(xiàn)數(shù)據(jù)共享。數(shù)據(jù)共享包含所有用戶可同時(shí)存取數(shù)據(jù)庫(kù)中的數(shù)據(jù),也包括用戶可以用各種方式通過接口使用數(shù)據(jù)庫(kù),并提供數(shù)據(jù)共享。(2)減少數(shù)據(jù)的冗余度。同文件系統(tǒng)相比,由于數(shù)

34、據(jù)庫(kù)實(shí)現(xiàn)了數(shù)據(jù)共享,從而避免了用戶各自建立應(yīng)用文件。減少了大量重復(fù)數(shù)據(jù),減少了數(shù)據(jù)冗余,維護(hù)了數(shù)據(jù)的一致性。(3)數(shù)據(jù)的獨(dú)立性。數(shù)據(jù)的獨(dú)立性包括數(shù)據(jù)庫(kù)中數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)和應(yīng)用程序相互獨(dú)立,也包括數(shù)據(jù)物理結(jié)構(gòu)的變化不影響數(shù)據(jù)的邏輯結(jié)構(gòu)。(4)數(shù)據(jù)實(shí)現(xiàn)集中控制。文件管理方式中,數(shù)據(jù)處于一種分散的狀態(tài),不同的用戶或同一用戶在不同處理中其文件之間毫無關(guān)系。利用數(shù)據(jù)庫(kù)可對(duì)數(shù)據(jù)進(jìn)行集中控制和管理,并通過數(shù)據(jù)模型表示各種數(shù)據(jù)的組織以及數(shù)據(jù)間的聯(lián)系。(5)數(shù)據(jù)一致性和可維護(hù)性,以確保數(shù)據(jù)的安全性和可靠性。主要包括:安全性控制:以防止數(shù)據(jù)丟失、錯(cuò)誤更新和越權(quán)使用;完整性控制:保證數(shù)據(jù)的正確性、有效性和相容性;并

35、發(fā)控制:使在同一時(shí)間周期內(nèi),允許對(duì)數(shù)據(jù)實(shí)現(xiàn)多路存取,又能防止用戶之間的不正常交互作用;故障的發(fā)現(xiàn)和恢復(fù):由數(shù)據(jù)庫(kù)管理系統(tǒng)提供一套方法,可及時(shí)發(fā)現(xiàn)故障和修復(fù)故障,從而防止數(shù)據(jù)被破壞2.4 odl文件語法2.4.1 odl文件語法結(jié)構(gòu)attributeslibrary libnamedefinitions;其中:attributes:定義庫(kù)的屬性。包括,如幫助文件,uuid,版本等。如: uuid(cf9d9b76-ec4b-470d-99dc-aec6f36a9261), helpstring(vb iobjectwithsite interface), version(1.0) library

36、 libname:定義一個(gè)庫(kù)。其中可以包括多個(gè)接口。庫(kù)定義包括:定義導(dǎo)入的其它類型庫(kù)modules, interfaces, dispinterfaces, and coclassesdata types:枚舉、聯(lián)合、結(jié)構(gòu) ;庫(kù)定義的內(nèi)容:imported libraries:引入其它類型庫(kù)。如:importlib(“stdole2.tlb”)2modules, interfaces, dispinterfaces, and coclasses:attributes/包括:uuid,helpstr等。元素關(guān)鍵字(module, interface, dispinterface, coclass

37、es)成員描述3數(shù)據(jù)類型定義(至少有一個(gè))包括別名alias、枚舉、聯(lián)合、結(jié)構(gòu)等:語法:typedef attributes typekind typename /使用c的typedef語法成員描述如:typedef public long guidptr;typedef public enum myenum解釋:dispinterface:dispatch接口。定義使用dispatch.invoke可以調(diào)用的方法和屬性。這些方法和屬性不使用vtbl方式調(diào)用,提供給不支持vtbl的語言的自動(dòng)化使用。vtbl:一個(gè)普通接口就是一個(gè)函數(shù)指針的表(vtbl)。在c、c+等語言的客戶端源代碼中,使用接

38、口的方法名調(diào)用方法,編譯器根據(jù)方法名找到方法在vtbl中的位置,在生成的二進(jìn)制代碼中以位置代替了名稱。這稱為前期綁定。但如vbscript, jscript等腳本不支持前期綁定,即不支持vtbl。這樣com服務(wù)器組件就必須提供idispatch接口。該接口定義了可以分發(fā)的方法的編號(hào)。腳本語言使用編號(hào)調(diào)用這些方法(使用idispatch接口的invoke()方法)。coclass: com中的類(或者說activex中的類)。對(duì)應(yīng)與cpp中的類定義。odl中聲明的coclass可以使用new關(guān)鍵字創(chuàng)建,或使用cocreateobject創(chuàng)建。2.4.2類型庫(kù)tlb的使用方法midl編譯器生成的類

39、型庫(kù)包含一些標(biāo)準(zhǔn)的接口,如:itypelib,itypelibinfo等。類型庫(kù)查看器(如oleviewer),或編程環(huán)境使用這些接口從tlb中讀取信息。vc編譯器不僅讀取信息,而且將其轉(zhuǎn)換為c或c+的頭文件。這樣在c或c+的源代碼中才能使用其中的接口、數(shù)據(jù)和類定義。語法為:#imports “類型庫(kù)(tlb或odl)”如果在stdafx.h中引入類型庫(kù),編譯stdafx.cpp后,就會(huì)產(chǎn)生相應(yīng)的.h文件。詳細(xì)情況:編譯器產(chǎn)生兩個(gè)頭文件:.tlh和tli。存放在編譯選項(xiàng)/fo指定的目錄中。(一般為debug, release目錄)其中包括了數(shù)據(jù)類型定義、常量定義、smart接口指針定義(包括c

40、oclass)、以及接口的guid。smart接口指針:_com_smartptr_typedef(imyinterface, _uuidof(imyinterface);程序中使用:imyinterfaceptr。可以使用_com_ptr_t獲得而不需要調(diào)用queryinterface,addref,releaseref等iunknown接口方法。注意包含:comdef.h。smart接口指針使用方式:對(duì)coclass對(duì)象的接口,可以通過在_com_ptr_t的構(gòu)造函數(shù)中傳導(dǎo)clsid或progid,自動(dòng)創(chuàng)建對(duì)象。如:_com_ptr_t ptr(clsid或progid);對(duì)于interf

41、ace,由于其對(duì)象由coclass對(duì)象的某些方法創(chuàng)建,本來這些方法返回iunknown指針,但使用_com_ptr_t可以自動(dòng)轉(zhuǎn)換為相應(yīng)類型的接口智能指針。接口的guid。形式為:clsid_coclassiid_interfaceguid用于非模板方式的com使用。如使用cocreateinstance(clsid)創(chuàng)建com對(duì)象,使用queryinterface獲得接口指針。vb中,通過“工程引用”來引入類型庫(kù)。注意,有的組件并未生成獨(dú)立的類型庫(kù)。而其信息包含在com組件本身中(如dll,exe文件中)。條件是組件中包含itypelib, itypelibinfo這些接口。2.5 ado技

42、術(shù)2.5.1什么是ado技術(shù)ado (activex data objects,activex數(shù)據(jù)對(duì)象)是microsoft提出的應(yīng)用程序接口(api)用以實(shí)現(xiàn)訪問關(guān)系或非關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。例如,如果您希望編寫應(yīng)用程序從db2或oracle數(shù)據(jù)庫(kù)中向網(wǎng)頁(yè)提供數(shù)據(jù),可以將ado程序包括在作為活動(dòng)服務(wù)器頁(yè)(asp)的html文件中。當(dāng)用戶從網(wǎng)站請(qǐng)求網(wǎng)頁(yè)時(shí),返回的網(wǎng)頁(yè)也包括了數(shù)據(jù)中的相應(yīng)數(shù)據(jù),這些是由于使用了ado代碼的結(jié)果。象microsoft的其它系統(tǒng)接口一樣,ado是面向?qū)ο蟮?。它是microsoft全局?jǐn)?shù)據(jù)訪問(uda)的一部分,microsoft認(rèn)為與其自己創(chuàng)建一個(gè)數(shù)據(jù),不如利用uda訪

43、問已有的數(shù)據(jù)庫(kù)。為達(dá)到這一目的,microsoft和其它數(shù)據(jù)庫(kù)公司在它們的數(shù)據(jù)庫(kù)和microsoft的ole數(shù)據(jù)庫(kù)之間提供了一個(gè)“橋”程序,ole數(shù)據(jù)庫(kù)已經(jīng)在使用ado技術(shù)。ado的一個(gè)特征(稱為遠(yuǎn)程數(shù)據(jù)服務(wù))支持網(wǎng)頁(yè)中的數(shù)據(jù)相關(guān)的activex控件和有效的客戶端緩沖。作為activex的一部分,ado也是microsoft的組件對(duì)象模式(com)的一部分,它的面向組件的框架用以將程序組裝在一起。ado從原來的microsoft數(shù)據(jù)接口遠(yuǎn)程數(shù)據(jù)對(duì)象(rdo)而來。rdo與odbc一起工作訪問關(guān)系數(shù)據(jù)庫(kù),但不能訪問如isam和vsam的非關(guān)系數(shù)據(jù)庫(kù)。ado 是對(duì)當(dāng)前微軟所支持的數(shù)據(jù)庫(kù)進(jìn)行操作的最

44、有效和最簡(jiǎn)單直接的方法,它是一種功能強(qiáng)大的數(shù)據(jù)訪問編程模式,從而使得大部分?jǐn)?shù)據(jù)源可編程的屬性得以直接擴(kuò)展到的active server 頁(yè)面上??梢允褂胊do 去編寫緊湊簡(jiǎn)明的腳本以便連接到 open database connectivity (odbc) 兼容的數(shù)據(jù)庫(kù)和 ole db 兼容的數(shù)據(jù)源,這樣 asp 程序員就可以訪問任何與 odbc 兼容的數(shù)據(jù)庫(kù),包括 ms sql server、access、 oracle 等等。比如,如果網(wǎng)站開發(fā)人員需要讓用戶通過訪問網(wǎng)頁(yè)來獲得存在于ibm db2或者oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù),那么就可以在asp頁(yè)面中包含ado程序,用來連接數(shù)據(jù)庫(kù)。于是,

45、當(dāng)用戶在網(wǎng)站上瀏覽網(wǎng)頁(yè)時(shí),返回的網(wǎng)頁(yè)將會(huì)包含從數(shù)據(jù)庫(kù)中獲取的數(shù)據(jù)。而這些數(shù)據(jù)都是由ado代碼做到的。ado是一種面向?qū)ο蟮木幊探涌冢④浗榻B說,與其同ibm和oracle提倡的那樣,創(chuàng)建一個(gè)統(tǒng)一數(shù)據(jù)庫(kù),不如提供一個(gè)能夠訪問不同數(shù)據(jù)庫(kù)的統(tǒng)一接口,這樣會(huì)更加實(shí)用一些。為實(shí)現(xiàn)這一目標(biāo),微軟在數(shù)據(jù)庫(kù)和微軟的ole db中提供了一種“橋”程序,這種程序能夠提供對(duì)數(shù)據(jù)庫(kù)的連接。開發(fā)人員在使用ado時(shí),其實(shí)就是在使用ole db,不過ole db更加接近底層。ado的一項(xiàng)屬性?遠(yuǎn)程數(shù)據(jù)服務(wù),支持“數(shù)據(jù)倉(cāng)庫(kù)”activex 組件以及高效的客戶端緩存。作為activex的一部分,ado也是com組件的一部分。a

46、do是由早期的微軟數(shù)據(jù)接口?遠(yuǎn)程數(shù)據(jù)對(duì)象rdo演化而來的。rdo同微軟的odbc一同連接關(guān)系數(shù)據(jù)庫(kù),不過不能連接非關(guān)系數(shù)據(jù)庫(kù)。ado向我們提供了一個(gè)熟悉的,高層的對(duì)ole db的automation封裝接口。對(duì)那些熟悉rdo的程序員來說,可以把ole db比作是odbc驅(qū)動(dòng)程序。如同rdo對(duì)象是odbc驅(qū)動(dòng)程序接口一樣,ado對(duì)象是ole db的接口;如同不同的數(shù)據(jù)庫(kù)系統(tǒng)需要它們自己的odbc驅(qū)動(dòng)程序一樣,不同的數(shù)據(jù)源要求它們自己的ole db提供者(ole db provider)。目前,雖然ole db提供者比較少,但微軟正積極推廣該技術(shù),并打算用ole db取代odbc。ado向vb程序

47、員提供了很多好處。包括易于使用,熟悉的界面,高速度以及較低的內(nèi)存占用(已實(shí)現(xiàn)ado2.0的msado15.dll需要占用342k內(nèi)存,比rdo的msrdo20.dll的368k略小,大約是dao3.5 的dao350.dll所占內(nèi)存的60)。同傳統(tǒng)的數(shù)據(jù)對(duì)象層次(dao和rdo)不同,ado可以獨(dú)立創(chuàng)建。因此可以只創(chuàng)建一個(gè) connection對(duì)象,但是可以有多個(gè),獨(dú)立的recordset對(duì)象來使用它。ado針對(duì)客戶服務(wù)器以及web應(yīng)用程序作了優(yōu)化。2.5.2如何在vb中使用ado一旦安裝了ado,在vb的工程-引用對(duì)話框中就可以看到象下圖所示的東西了:選擇 activex data obje

48、cts 1.5 library (adodb).在其下的 ado recordset 1.5 library是一個(gè)客戶端的版本(ador),它定義了有聚的數(shù)據(jù)訪問對(duì)象。ador 對(duì)于客戶端的數(shù)據(jù)訪問來說是足夠的了,因?yàn)椴恍枰猚onnection對(duì)象來建立與遠(yuǎn)程數(shù)據(jù)源的聯(lián)系。如果想要訪問更多的外部數(shù)據(jù)源,需要安裝這些外部數(shù)據(jù)源自己的ole db provider,就象需要為新的數(shù)據(jù)庫(kù)系統(tǒng)安裝新的odbc驅(qū)動(dòng)程序一樣。如果該外部數(shù)據(jù)源沒有自己的ole db provider,就得使用ole db sdk來自己為這個(gè)外部數(shù)據(jù)源創(chuàng)建一個(gè)ole db provider了。示例下面的示例代碼以northw

49、inds數(shù)據(jù)庫(kù)作為遠(yuǎn)程數(shù)據(jù)源,然后用ado來訪問它。首先在控制面板中打開“32位數(shù)據(jù)源”,單擊“添加”按鈕。在彈出的對(duì)話框中選擇 microsoft access driver (*.mdb) 作為數(shù)據(jù)源驅(qū)動(dòng)程序。然后按下圖所示,在對(duì)話框中填寫下面的內(nèi)容選擇數(shù)據(jù)庫(kù)northwinds所在路徑。單擊完成,退出odbc設(shè)備管理器。啟動(dòng)一個(gè)新的vb工程,在窗體的load事件中輸入下面的代碼:private sub form_load()dim cn as adodb.connectionset cn = new adodb.connectionset connection propertiescn.

50、connectionstring = dsn=rdc nwind;uid=;pwd=;cn.connectiontimeout = 30cn.openif cn.state = adstateopen then _msgbox connection to northwind successful!cn.closeend sub按f5運(yùn)行程序,看看,一個(gè)消息框彈出來告訴連接成功了。請(qǐng)注意,這里我特別注明了是adodb.connection,而不是ador.connection,這樣做是為了將二者區(qū)分開(如果引用了adodb和ador的話,這樣做很有必要)。連接字符串看上去同rdo的連接字符串差不

51、多。事實(shí)上,二者確實(shí)差不多。如果我們要訪問一個(gè)sql server數(shù)據(jù)庫(kù),的connection代碼看上去應(yīng)象下面所示:設(shè)置連接屬性cn.provider = msdasqlcn.connectionstring = driver=sql server; & server=prod1;uid=bg;pwd=;database=maincn.openprovider屬性指向sql server的ole db provider.回到我們的示例程序,讓我們創(chuàng)建一個(gè)recordset對(duì)象來訪問“orders”表,并從該表的shipcountry字段中產(chǎn)生頭十個(gè)不重復(fù)的國(guó)家名。修改窗體load事件中的代

52、碼,讓它看上去象下面這樣。private sub form_load()dim cn as adodb.connectiondim rs as adodb.recordsetdim ssql as stringdim sout as stringdim count as integerset cn = new adodb.connectionset rs = new adodb.recordset set properties of the c.connectionstring = dsn=rdc nwind;uid=;pwd=;cn.connectiontimeout

53、 = 30cn.openif cn.state = adstateopen then _msgbox connection to northwind successful!ssql = select distinct orders.shipcountry from ordersset rs = cn.execute(ssql)enumerate the recordsetsout = for count = 1 to 10sout = sout & rs(shipcountry) & vbcrlfrs.movenextnext countmsgbox sout, vbexclamation,

54、ado resultsend sub運(yùn)行程序后,會(huì)看到如下圖所示的消息框。不幸的是,目前這個(gè)recrodset對(duì)象是只讀的和forward cursor。如果想要獲取更多的功能,需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的recordset對(duì)象,該對(duì)象擁有自己的connection屬性,就象下面的代碼所示:private sub form_load()dim rs as adodb.recordsetdim ssql as stringdim sout as stringdim count as integerset rs = new adodb.recordsetssql = select distinct orde

55、rs.shipcountry from ordersrs.open ssql, dsn=rdc nwind;uid=;pwd=;, adopendynamicreport recordset connection informationmsgbox rs.activeconnection, , connection infoenumerate the recordsetsout = for count = 1 to 10sout = sout & rs(shipcountry) & vbcrlfrs.movenextnext countmsgbox sout, vbexclamation, a

56、do resultsrs.closeend sub上面代碼返回的結(jié)果同前例一樣,但是本代碼中的recordset是獨(dú)立的。這一點(diǎn)是dao和rdo做不到的。recordset對(duì)象的open方法打開一個(gè)代表從sql查詢返回的記錄的游標(biāo)。雖然可以用connection對(duì)象同遠(yuǎn)程數(shù)據(jù)源建立連接,但請(qǐng)記住,在這種情況下,connection對(duì)象和recordset對(duì)象是平行的關(guān)系。2.5.3 ado技術(shù)主要應(yīng)用舉例ado(activex data objects)是基于組件的數(shù)據(jù)庫(kù)編程接口,它是一個(gè)和編程語言無關(guān)的com組件系統(tǒng)。本文主要介紹用ado編程所需要注意的技巧和在vc下進(jìn)行ado 編程的模式,并對(duì)cextensions進(jìn)行了簡(jiǎn)單的討論,希望對(duì)ado開發(fā)人員有一定的幫助作用。因?yàn)閍do是一個(gè)和編程語言無關(guān)的com組件系統(tǒng),所以這里討論的要點(diǎn)適用于所有的編程語言和編程環(huán)境,比如:vb、vbscript、vc、java等等。編程技巧1顯式定義對(duì)象類型實(shí)際上,這條準(zhǔn)則不僅適用于ado編程,也適用于其他的與com對(duì)象相關(guān)的

溫馨提示

  • 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)論