于珊珊
摘要:討論了插件技術的原理、插件的管理、插件的實現方案,在此基礎上研究了插件技術在數據庫開發過程中的應用。
關鍵詞:插件接口數據庫系統開發
1插件技術的原理
1.1動態鏈接庫(Dynamic Link Li-brary)
它本身不能獨立運行,但它能輸出函數或類,通過其它能獨立運行的程序(宿主程序)可以調用它內部的功能。動態鏈接庫有兩種調用方式:
(1)靜態調用方式:由編譯系統完成對DLL的加載和應用程序結束時DLL卸載的編碼。
隱式的調用:需要把產生動態連接庫時產生的,LIB文件加入到應用程序的工程中,想使用DLL中的函數時,只須說明一下。隱式調用不需要調用LoadLibrary()和FreeIAbrary()。程序員在建立一個DLL文件時,鏈接程序會自動生成一個與之對應的LIB導入文件。該文件包含每一個DLL導出函數的符號名和可選的標識號,但是并不含有實際的代碼。LIB文件作為DLL的替代文件被編譯到應用程序項目中。當程序員通過靜態鏈接方式編譯生成應用程序時,應用程序中的調用函數與LIB文件中導出符號相匹配,這些符號或標識號進入到生成的EXE文件中。LIB文件中也包含了對應的DLL文件名(但不是完全的路徑名),鏈接程序將其存儲在EXE文件內部。
當應用程序運行過程中需要加載DLL文件時,Windows根據這些信息發現并加載DLL,然后通過符號名或標識號實現對DLL函數的動態鏈接。所有被應用程序調用的DLL文件都會在應用程序EXE文件加載時被加載到內存中。可執行程序鏈接到一個包含DLL輸出函數信息的輸入庫文件(.LIB文件)。操作系統在加載使用可執行程序時加載DLL。可執行程序直接通過函數名調用DLL的輸出函數,調用方法和程序內部其他函數一樣。
(2)動態調用方式:由編程者用API函數加載和卸載DLL調用DLL,使用較復雜,但能更有效地使用內存,是編制大型應用程序的重要方式。
顯式的調用:是指在應用程序中用I.oadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態連接庫調進來,動態連接庫的文件名即是上面兩個函數的參數,再用GetProcAddress()獲取想要引入的函數。自此,你就可以象使用如同本應用程序自定義的函數一樣來調用此引入函數了。在應用程序退出之前,應該用FreeLibrary或MFC提供的MxFreeLi-brary釋放動態連接庫。直接調用Win32的LoadLibary函數,并指定DLL的路徑作為參數。LoadLibary返回HINSTANCE參數,應用程序調用GetProcAddress函數時使用這一參數。C,etProcAddress函數將符號名或標識號轉換為DLL內部的地址。程序員可決定DLL文件何時加載或不加載,顯式鏈接在運行時決定加載哪個DLL文件。使用DLL的程序在使用之前必加載(LoadLibrary)DLL,得到一個DLL模塊的句柄,然后調用GetPro-cAddress函數得到輸出函數指針,在退出之前必卸載(FreeLibrary)DLL。
1.2接口。宿主程序與插件只能通過制訂好的接口進行通信。軟件開發中,接口只是定義功能并規定調用功能的形式,而不包含功能的實現。接口實質上是軟件模塊的調用規范。就開發支持插件功能的應用程序而言,一般來說由宿主程序的開發者來制訂接口,如果希望其他的開發人員能開發相關的插件,只要公開相關的接口即可。接口功能一般由插件方實現。因為插件的實現也許要調用宿主程序的功能,所以接口功能也可能由宿主程序來實現。也就是說,宿主程序與插件的信息流可能是雙向的。接口的調用規范與功能實現相互分離有一個很大的優點:盡管不同的插件開發者對同一個接口的具體實現不同,但是在宿主程序中對這些插件的調用方式是一樣的。如果有宿主程序實現的接口,在不同的插件中也可以用相同的使用方式調用宿主程序的功能。這極大地提高了應用程序的靈活性。
1.3開發支持插件功能應用程序的解決方案。(在動態鏈接庫中實現插件接口,在宿主程序中運用顯式鏈接方式動態加載插件。支持插件功能的應用程序的結構如圖1所示。在宿主程序中,插件管理部分用于管理插件的安裝和刪除,并將所安裝插件的信息保存到適合的地方,例如保存到注冊表或配置文件中。宿主程序啟動時,根據插件的配置信息加載插件模塊,然后獲得插件的輸出函數或輸出類的指針并加以保存,如果需要的話,可以向宿主程序增加界面接口元素,如菜單、工具條按鈕等。在宿主程序中當點擊與插件相關聯的接口元素(如菜單等)時,就會觸發插件調用函數,在插件調用函數中使用宿主程序中所保存的插件信息調用插件中實現的功能。在調用插件輸出函數時也可以把宿主程序中實現的接口傳遞給插件方。
2插件管理
主程序必須為支持插件提供插件管理功能,它調用了插件提供的接口,其具體實現實際上是由插件本身完成的。插件管理主要提供以下幾個方面的功能:(1)注冊、反注冊插件。(2)啟用、禁用插件。(3)顯示插件基本信息。(4)配置插件參數。
3插件的實現方案
對于插件的實現,有動態鏈接庫(DLL)、COM組件兩種方案,目前的系統中,采用動態鏈接庫(DLL)方案。(1)DLL是在Windows系統中實現軟件組件重要的方法,在動態鏈接庫(DLL)中,集中實現插件,只需用戶有在Windows下編寫一般DLL的經歷,再花少量的時間熟練有關插件的調用規則及編程規則,就可進行插件設計與開發;(2)COM,即組件對象模型,是一種以組件為發布單元的對象模型,這種模型使各軟件組件可以用一種統一的方式進行交互。COM既提供了組件之間進行交互的規范,也提供了實現交互的環境,由于同類插件一般有統一的調用接口,因此也可使用COM技術作為開發插件的基礎。COM接口是COM對象與系統之間的交互通道,而調用插件的函數在同類插件間是基本相同的,因而,可把插件的初始化及調用插件的交互通道定義為插件的接口,則編寫插件也就是編寫COM插件的過程,同時,也有利于多個插件實現在一個COM組件中,并應用組件的聚合等專有技術實現功能更強的插件。使用COM技術作為編寫插件的技術,更易于在插件與系統間進行交互操作,對編寫插件及擴大插件的使用范圍是很有利的;但與之相應的是,應用COM技術編寫插件時,涉及大量的COM技術及原理,導致開發者難以迅速地應用該項技術編寫插件來解決實際問題。
4插件技術在數據庫開發中的應用
由于系統設計上已經使用插件技術,將每項功能都單獨設計,使得系統在開發過程中變得更加可視,可控,易控,用插件技術設計數據庫系統并不是簡單的將數據庫系統劃分模塊,它已經將每項功能都劃分成了單獨設計體,因此,在每項功能的開發過程中,都可以明確每一項功能的開發責任,可以明確每一項功能的結構,輸入,輸出,所需數據,處理方式等要素。它將模塊更加細化,并切斷了模塊當中每一項功能之間的聯系,減少了制約因素。這就使開發進度表由模塊級劃分變成由功能級劃分,由模塊進度線變成功能進度線,從而擴大了單位時間的開發量,變縱向式開發為橫向式開發。在功能開發完畢。進行調試過程當中,由于開發使用了插件技術,使得調試工作更加簡單,調試內容變得更少,更有利于進行白盒測試,保證了軟件的質量。