專利名稱::一種組件間調(diào)用方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種程序執(zhí)行方法,尤其是一種程序執(zhí)行過(guò)程種組件間的調(diào)用方法。
背景技術(shù):
:應(yīng)用程序可執(zhí)行的文件(Executableprogram),是指為了完成某項(xiàng)或某幾項(xiàng)特定任務(wù)而被開(kāi)發(fā)運(yùn)行于操作系統(tǒng)之上的計(jì)算機(jī)程序。它符合操作系統(tǒng)指定的某種格式,并以二進(jìn)制的形式被存儲(chǔ),操作系統(tǒng)負(fù)責(zé)對(duì)程序的加載和運(yùn)行。早期的程序設(shè)計(jì)沒(méi)有組件的思想,所有功能都集中在一個(gè)可執(zhí)行文件中?,F(xiàn)今,應(yīng)用程序通常以功能為標(biāo)準(zhǔn)被劃分為多個(gè)相對(duì)獨(dú)立的組件進(jìn)行編寫(xiě)。每個(gè)組件相對(duì)獨(dú)立,組件間通過(guò)接口實(shí)現(xiàn)相互的調(diào)用。當(dāng)一個(gè)功能需求發(fā)生變化時(shí),在保持接口不變的前提下,修改發(fā)生變化的功能組件,可使其它組件的代碼保持不變。每個(gè)組件編寫(xiě)完成后,應(yīng)用程序可以在需要組件的功能時(shí)動(dòng)態(tài)的鏈接到組件,調(diào)用組件的接口。從而減少應(yīng)用程序的大小和啟動(dòng)時(shí)間;同時(shí),這個(gè)組件也可以同時(shí)被多個(gè)應(yīng)用程序使用。為了減少軟件開(kāi)發(fā)的復(fù)雜性,提高組件的重用性,現(xiàn)有的操作系統(tǒng)都提供了組件的構(gòu)建標(biāo)準(zhǔn),在Windows下我們稱基于該標(biāo)準(zhǔn)的組件為動(dòng)態(tài)鏈接庫(kù)(DLL,DynamicLinkLibrary);在Linux下稱為共享對(duì)象文件(SoSharedObjectFile)等。以windows操作系統(tǒng)下的動(dòng)態(tài)鏈接庫(kù)為例組件C編寫(xiě)完成后,可編譯成一個(gè)DLL。在運(yùn)行時(shí),只有當(dāng)EXE程序要調(diào)用這些DLL組件時(shí),系統(tǒng)才會(huì)將它們裝載到內(nèi)存空間中。這種方式不僅減少了EXE文件的大小和對(duì)內(nèi)存空間的需求,而且使這些DLL組件可以同時(shí)被多個(gè)應(yīng)用程序使用。同時(shí),為了在Windows平臺(tái)形成一種統(tǒng)一的組件開(kāi)發(fā)和調(diào)用規(guī)范,實(shí)現(xiàn)組件間的通信以及組件間的調(diào)用,微軟提出組件對(duì)象模型(COM,ComponentObjectModel)的方法,但由于其調(diào)用機(jī)制使得在組件與組件、客戶與組件之間的調(diào)用實(shí)現(xiàn)之前需要編寫(xiě)大量的代碼,實(shí)現(xiàn)復(fù)雜;并且,由于COM組件必須在注冊(cè)表中注冊(cè)以獲取組件ID,在調(diào)用時(shí)通過(guò)查找注冊(cè)表加載組件,然而,只有Windows平臺(tái)存在注冊(cè)表,因而基于COM開(kāi)發(fā)的組件不能進(jìn)行跨操作系統(tǒng)的移植。
發(fā)明內(nèi)容本發(fā)明的目的是提供一種組件間調(diào)用的方法,該方法能夠不依賴注冊(cè)表,并且實(shí)現(xiàn)簡(jiǎn)單。為解決上述技術(shù)問(wèn)題,本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的1)為每個(gè)組件建立確定的標(biāo)識(shí)和用于創(chuàng)建組件的函數(shù),以及建立組件接口;2)程序加載到預(yù)置的共享內(nèi)存,并觸發(fā)將組件標(biāo)識(shí)以及所述函數(shù)保存到共享內(nèi)存;3)客戶組件請(qǐng)求調(diào)用目標(biāo)組件,系統(tǒng)查找目標(biāo)組件標(biāo)識(shí)以調(diào)用所述函數(shù)創(chuàng)建組件,返回目標(biāo)組件接口,客戶組件根據(jù)所述接口實(shí)現(xiàn)功能調(diào)用。在上述方法基礎(chǔ)上,1)中還包括將多個(gè)所述的組件進(jìn)行編譯,構(gòu)成組件集。上述方法中,3)中系統(tǒng)調(diào)用所述函數(shù)后,返回組件的接口指針,客戶組件根據(jù)共享內(nèi)存中的接口指針獲取目標(biāo)組件的接口。2)中程序加載到內(nèi)存后,系統(tǒng)根據(jù)主程序的配置文件中預(yù)置的組件地址,讀取確定目錄下的組件,將組件接口集加入特定的共享內(nèi)存;系統(tǒng)根據(jù)組件構(gòu)造函數(shù)中預(yù)置的代碼,進(jìn)行保存組件標(biāo)識(shí)及所述函數(shù)的操作。以上技術(shù)方案可以看出,本發(fā)明中程序加載到內(nèi)存時(shí)將組件的信息保存到內(nèi)存中,使得本發(fā)明的實(shí)現(xiàn)不需要依賴操作系統(tǒng)的特殊設(shè)置,例如采用本發(fā)明的方法實(shí)現(xiàn)組件間的調(diào)用時(shí)不依靠Windows系統(tǒng)中特有的注冊(cè)表,因此本發(fā)明的組件間的調(diào)用不依賴于特定的操作系統(tǒng),使得本發(fā)明的方法是可以跨操作平臺(tái)實(shí)現(xiàn)。并且,在實(shí)際程序開(kāi)發(fā)中采用本發(fā)明的方法時(shí)發(fā)現(xiàn),與現(xiàn)有的依靠特定系統(tǒng)實(shí)現(xiàn)組件調(diào)用的方法相比,本發(fā)明組件間的調(diào)用相對(duì)簡(jiǎn)單,不需要大量的編碼工作,從而提高了軟件的開(kāi)發(fā)效率。本發(fā)明利用了系統(tǒng)提供的共享內(nèi)存,通過(guò)在共享內(nèi)存中管理和維護(hù)特定的組件信息結(jié)構(gòu),從而使得各組件在所述共享內(nèi)存中進(jìn)行相互訪問(wèn),使得組件間的調(diào)用更加方便簡(jiǎn)單。進(jìn)一步,本發(fā)明中可以把多個(gè)組件編譯成一個(gè)組件,實(shí)踐證明,本發(fā)明中把多個(gè)組件編譯成一個(gè)組件,在讀取組件的過(guò)程中,減少了對(duì)磁盤(pán)的輸入輸出操作,提高了組件加載和執(zhí)行效率。并且,實(shí)踐中發(fā)現(xiàn),由于每個(gè)組件都會(huì)被自動(dòng)注冊(cè)在內(nèi)存中,因而,在這種方法下將多個(gè)組件編譯為一個(gè)組件,給軟件開(kāi)發(fā)提供了調(diào)試和發(fā)布的靈活性。圖1為本發(fā)明較佳實(shí)施例流程圖;圖2為本發(fā)明組件調(diào)用過(guò)程示意圖。具體實(shí)施例方式本發(fā)明涉及一種組件間調(diào)用的方法。其核心在于每當(dāng)可執(zhí)行程序被加載到內(nèi)存后,自動(dòng)把指定目錄下的所有組件信息(組件ID和創(chuàng)建該組件的函數(shù)指針)加載到可執(zhí)行程序創(chuàng)建的一塊共享內(nèi)存中,調(diào)用某一個(gè)組件時(shí),根據(jù)內(nèi)存中組件所保存的信息,創(chuàng)建組件對(duì)象,從而實(shí)現(xiàn)組件功能調(diào)用。以下說(shuō)明本發(fā)明的一較佳實(shí)施例,該實(shí)施例的原理為當(dāng)一個(gè)進(jìn)程開(kāi)始時(shí),執(zhí)行體DLL或EXE被加載到內(nèi)存,利用C++編程語(yǔ)言的全局對(duì)象的構(gòu)造函數(shù)先于C運(yùn)行庫(kù)(C-RuntimeLibrary)執(zhí)行的原理,在某個(gè)全局對(duì)象的構(gòu)造函數(shù)中把組件內(nèi)的信息組(組件ID,組件的創(chuàng)建體)存儲(chǔ)在操作系統(tǒng)中進(jìn)程的一塊內(nèi)存上,使得進(jìn)程的任何組件和客戶程序都能獲取到這些信息組并根據(jù)信息組中的創(chuàng)建體創(chuàng)建組件對(duì)象。當(dāng)調(diào)用一個(gè)組件時(shí),通過(guò)組件ID查找在內(nèi)存中保存的用于創(chuàng)建組件的函數(shù),再通過(guò)對(duì)該函數(shù)的調(diào)用創(chuàng)建組件。組件被創(chuàng)建后,可以調(diào)用組件的接口來(lái)實(shí)現(xiàn)特定的組件功能。參照?qǐng)D1,本發(fā)明較佳實(shí)施例的實(shí)現(xiàn)方法如下。步驟11為每個(gè)組件賦予確定的標(biāo)識(shí)ID和用于創(chuàng)建該組件的函數(shù),以及建立組件接口;建立共享內(nèi)存。所述組件,亦稱為模塊,其特征包括是封裝性,組件必須向外部隱藏其內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),使從外部所能看到的只是接口;組件必須能動(dòng)態(tài)鏈接到一起,被調(diào)用的時(shí)候不必重新編譯。本發(fā)明中為每個(gè)組件賦予一個(gè)唯一的標(biāo)識(shí)和用于創(chuàng)建該組件的函數(shù)。與上文所述現(xiàn)有技術(shù)的COM方法相比,本發(fā)明為每個(gè)組件預(yù)置唯一的標(biāo)識(shí),而并非如COM組件一樣,其ID通過(guò)在注冊(cè)表中注冊(cè)后獲取。由于組件向外部隱藏了其內(nèi)部的細(xì)節(jié),因此客戶要使用組件時(shí)就必須通過(guò)一定的機(jī)制,即通過(guò)一定的方法實(shí)現(xiàn)客戶與組件之間的通信,這就需要接口。所謂接口就是組件對(duì)外的、向外部客戶提供服務(wù)的“連接點(diǎn)”。外部的客戶見(jiàn)不到組件內(nèi)部的細(xì)節(jié),它所能看到的只是接口,客戶也是通過(guò)接口來(lái)獲取組件提供的服務(wù),通常,組件的開(kāi)發(fā)人員負(fù)責(zé)實(shí)現(xiàn)這個(gè)接口,而客戶則通過(guò)接口獲得服務(wù)。本文所述的客戶是指要使用某一個(gè)組件的程序或組件,也就是說(shuō),本文的客戶是相對(duì)組件來(lái)說(shuō)的。本發(fā)明中為每個(gè)組件提供一個(gè)接口,用于其他組件的函數(shù)調(diào)用。通過(guò)應(yīng)用程序接口(API)應(yīng)用程序建立一塊共享內(nèi)存,用于本發(fā)明中對(duì)組件信息的管理以及調(diào)用。所述共享內(nèi)存的建立為本領(lǐng)域公知技術(shù)。步驟12對(duì)每個(gè)組件進(jìn)行編譯,并保存到指定的目錄;根據(jù)需要也可以將多個(gè)組件編譯成一個(gè)組件集,亦即將多個(gè)組件編譯為一個(gè)DLL或一個(gè)EXE。具體的,將每個(gè)組件進(jìn)行編譯,并保存到指定的目錄下,在主程序的配置文件中標(biāo)識(shí)組件保存的地址信息,使得系統(tǒng)執(zhí)行到所述配置文件時(shí)可到正確的目錄下讀取程序運(yùn)行所需的所有組件。步驟13某個(gè)組件加載到內(nèi)存時(shí),觸發(fā)將組件標(biāo)識(shí)以及所述函數(shù)保存到內(nèi)存。如上文所述,本實(shí)施例中利用C++編程語(yǔ)言的全局對(duì)象的構(gòu)造函數(shù)先于C運(yùn)行庫(kù)(C-RuntimeLibrary)執(zhí)行的原理,在某個(gè)全局對(duì)象的構(gòu)造函數(shù)中把組件內(nèi)的信息組(組件ID,組件的創(chuàng)建函數(shù))存儲(chǔ)在操作系統(tǒng)中進(jìn)程的一塊內(nèi)存上。每個(gè)組件都會(huì)提供一個(gè)入口地址,即告知系統(tǒng)讀取該組件后所應(yīng)執(zhí)行的代碼,所述入口地址一般指向編譯器設(shè)定的地址。C++編譯器會(huì)自動(dòng)設(shè)定這個(gè)地址,從而在這個(gè)地址上調(diào)用全局對(duì)象的構(gòu)造函數(shù)。當(dāng)組件被加載到內(nèi)存后,依據(jù)組件提供的入口地址,系統(tǒng)會(huì)自動(dòng)去執(zhí)行構(gòu)造函數(shù),本發(fā)明在組件的構(gòu)造函數(shù)中編寫(xiě)代碼,用于在共享內(nèi)存中保存組件信息。當(dāng)進(jìn)程開(kāi)始時(shí),系統(tǒng)根據(jù)所述主程序中的配置文件到正確的目錄下讀取組件,進(jìn)而系統(tǒng)執(zhí)行所述構(gòu)造函數(shù)將組件的唯一標(biāo)識(shí)以及用于創(chuàng)建組件的函數(shù)加載到內(nèi)存中。加載指定目錄下的組件信息時(shí),每加載一個(gè)組件的信息,就要有一次遍歷該目錄的操作,進(jìn)行一次輸入輸出操作,浪費(fèi)系統(tǒng)資源。因而,上述步驟12中將多個(gè)組件編譯成一個(gè)組件(組件集),進(jìn)而加載組件時(shí)減少了輸入輸出操作,提高了效率。在多個(gè)組件編譯為一個(gè)組件集后,在加載該組件集信息到內(nèi)存的過(guò)程中,由于,每個(gè)組件代碼里都有一個(gè)不同的全局對(duì)象(通過(guò)C++宏的使用實(shí)現(xiàn)),該個(gè)組件集內(nèi)的每個(gè)組件的信息是獨(dú)立保存的。步驟14發(fā)生組件調(diào)用,在內(nèi)存中查找目標(biāo)組件標(biāo)識(shí)以調(diào)用函數(shù)創(chuàng)建組件,返回目標(biāo)組件的實(shí)例。通過(guò)這個(gè)實(shí)例可以調(diào)用組件的各個(gè)功能接口,據(jù)所述接口實(shí)現(xiàn)功能調(diào)用。組件間進(jìn)行調(diào)用時(shí),通過(guò)共享內(nèi)存中保存的組件信息,獲取創(chuàng)建被調(diào)用組件(目標(biāo)組件)的函數(shù)指針,組件被創(chuàng)建后,返回組件接口指針,客戶通過(guò)所述組件接口指針獲取目標(biāo)組件的接口,進(jìn)而實(shí)現(xiàn)組件間的功能調(diào)用。現(xiàn)有技術(shù)中,應(yīng)用程序執(zhí)行后,被加載到內(nèi)存,當(dāng)應(yīng)用程序要調(diào)用組件時(shí),組件信息會(huì)被寫(xiě)到內(nèi)存中。假設(shè)應(yīng)用程序需要調(diào)用3個(gè)組件,分別是dll1、dll2、dll3,程序會(huì)為這三個(gè)組件創(chuàng)建一個(gè)內(nèi)存空間,供其寫(xiě)入信息。然而這三個(gè)內(nèi)存空間都是獨(dú)立的,互無(wú)關(guān)系,導(dǎo)致三個(gè)組件間進(jìn)行訪問(wèn)時(shí),實(shí)現(xiàn)繁瑣。本發(fā)明中采用了共享內(nèi)存的機(jī)制。本發(fā)明實(shí)施例中,應(yīng)用程序首先通過(guò)系統(tǒng)提供的函數(shù)創(chuàng)建一塊共享內(nèi)存,當(dāng)應(yīng)用程序調(diào)用組件時(shí),會(huì)為每個(gè)組件在這塊共享內(nèi)存中創(chuàng)建一塊空間,每個(gè)組件可通過(guò)組件名稱互相訪問(wèn)。通過(guò)組件名稱進(jìn)行訪問(wèn)是系統(tǒng)為共享內(nèi)存提供的一種命名機(jī)制。通常,每個(gè)組件只能對(duì)自己的空間進(jìn)行管理,其他組件及應(yīng)用程序都無(wú)權(quán)對(duì)其管理。例如應(yīng)用程序調(diào)用完dll1,需要釋放dll1所在的這塊空間,而應(yīng)用程序無(wú)權(quán)做這項(xiàng)工作。這個(gè)缺陷導(dǎo)致組件空間管理上,很不靈活。本發(fā)明為每個(gè)組件建立了唯一的標(biāo)識(shí)ID,通過(guò)傳送組件ID,可以達(dá)到組件間進(jìn)行內(nèi)存空間管理的目的。參照?qǐng)D2,進(jìn)一步說(shuō)明組件調(diào)用過(guò)程的處理方法。如圖所示,圖中可執(zhí)行程序EXE,由組件1、組件2、組件3、組件4、組件5組成。進(jìn)程開(kāi)始,當(dāng)EXE被加載到內(nèi)存,組件1到組件5分別被加載到應(yīng)用程序建立的共享內(nèi)存中,依據(jù)組件提供的入口地址,系統(tǒng)自動(dòng)執(zhí)行構(gòu)造函數(shù),保存每個(gè)組件的信息(唯一標(biāo)識(shí)ID和用于創(chuàng)建該組件的函數(shù))到共享內(nèi)存中。組件信息保存后,被加載的組件可釋放內(nèi)存空間。然而,組件對(duì)內(nèi)存空間的釋放并非本發(fā)明所必不可少的操作。當(dāng)發(fā)生組件調(diào)用,假設(shè)組件1調(diào)用組件3,根據(jù)組件3的唯一標(biāo)識(shí)ID3,查找到用于創(chuàng)建組件3的函數(shù)CoCreate3(),創(chuàng)建組件3后,返回組件3的接口指針,組件1通過(guò)所述組件3接口的指針獲取該接口,并通過(guò)該接口調(diào)用組件3的功能函數(shù)。以上對(duì)本發(fā)明所提供的一種組件間調(diào)用方法進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。權(quán)利要求1.一種組件間調(diào)用方法,其特征在于1)為每個(gè)組件建立確定的標(biāo)識(shí)和用于創(chuàng)建組件的函數(shù),以及建立組件接口;2)程序加載到預(yù)置的共享內(nèi)存,并觸發(fā)將組件標(biāo)識(shí)以及所述函數(shù)保存到共享內(nèi)存;3)客戶組件請(qǐng)求調(diào)用目標(biāo)組件,系統(tǒng)查找目標(biāo)組件標(biāo)識(shí)以調(diào)用所述函數(shù)創(chuàng)建組件,返回目標(biāo)組件接口,客戶組件根據(jù)所述接口實(shí)現(xiàn)功能調(diào)用。2.如權(quán)利要求1所述的組件間調(diào)用方法,其特征在于1)中還包括將多個(gè)所述的組件進(jìn)行編譯,構(gòu)成組件集。3.如權(quán)利要求1所述的組件間調(diào)用方法,其特征在于3)中系統(tǒng)調(diào)用所述函數(shù)后,返回組件的接口指針,客戶組件根據(jù)共享內(nèi)存中的接口指針獲取目標(biāo)組件的接口。4.如權(quán)利要求1所述的組件間調(diào)用方法,其特征在于2)中系統(tǒng)根據(jù)組件構(gòu)造函數(shù)中預(yù)置的代碼,進(jìn)行保存組件標(biāo)識(shí)及所述函數(shù)的操作。5.如權(quán)利要求1或4所述的組件間調(diào)用方法,其特征在于2)中程序加載到內(nèi)存后,系統(tǒng)根據(jù)主程序的配置文件中預(yù)置的組件地址,讀取確定目錄下的組件,將組件接口集加入特定的共享內(nèi)存。全文摘要本發(fā)明涉及一種組件間調(diào)用方法,包括1)為每個(gè)組件建立確定的標(biāo)識(shí)和用于創(chuàng)建組件的函數(shù),以及建立組件接口;2)程序加載到預(yù)置的共享內(nèi)存,并觸發(fā)將組件標(biāo)識(shí)以及所述函數(shù)保存到共享內(nèi)存;3)客戶組件請(qǐng)求調(diào)用目標(biāo)組件,系統(tǒng)查找目標(biāo)組件標(biāo)識(shí)以調(diào)用所述函數(shù)創(chuàng)建組件,返回目標(biāo)組件接口,客戶組件根據(jù)所述接口實(shí)現(xiàn)功能調(diào)用。本發(fā)明的組件間的調(diào)用不依賴于特定的操作系統(tǒng),使得本發(fā)明的方法可以跨操作平臺(tái)實(shí)現(xiàn)。本發(fā)明組件間的調(diào)用相對(duì)簡(jiǎn)單,不需要大量的編碼工作,從而提高了軟件的開(kāi)發(fā)效率。文檔編號(hào)G06F9/46GK1834918SQ20051011549公開(kāi)日2006年9月20日申請(qǐng)日期2005年11月4日優(yōu)先權(quán)日2005年11月4日發(fā)明者孫華慶,周焱申請(qǐng)人:北京金山軟件有限公司