使用DLL作為外掛程式的設計框架

2021-05-27 11:46:49 字數 1689 閱讀 5780

在應用程式中,常常需要設計一種框架來適應需求的不斷變化。經常地,在軟體發布之後,使用者需要增加新的功能,或者不同的使用者需要根據各自特定的需求定製功能。為了達到這個目的而無需重寫**或者重做「開發——編譯——測試——發布」等一系列任務,我們可以實現一種在不破壞現有**的條件下可擴充模組的框架。使用外掛程式(plug-in)的框架可以滿足這一需要。

那麼什麼是使用外掛程式的框架呢?簡單地說,這種框架能允許軟體在啟動時查詢附加的功能模組並將其與軟體整合。許多應用程式,例如microsoft office,就使用了類似的技術來允許第三方開發者來對已有的應用程式進行擴充套件。

怎麼樣來開發使用外掛程式的框架呢?一種非常簡單的方法就是使用dll(動態鏈結庫)來實現外掛程式擴充套件。當應用程式啟動的時候,在預設的目錄中查詢符合一定規範的dll檔案。查詢完成後,應用程式使用約定好的介面呼叫dll模組。

框架的生命週期如下所示:

1, 應用程式初始化。

2, on_init()函式在指定的目錄中查詢dll檔案,例如,plug-in目錄。

3, 應用程式對每個查詢到的dll呼叫load()函式。

4, load()呼叫之後,應用程式儲存每個模組的名字,並對每個模組建立引用,這樣,模組中的函式就可以在隨後被呼叫。

5, 在應用程式執行的過程中,當使用者選擇選單項時,相應的所定義的功能就會被執行。

6, 關閉應用程式時,呼叫unload()函式,用來釋放load()函式中所申請的資源。

下面給出乙個c++中使用dll作為外掛程式的例子。

為了將問題簡化,這裡使用visual studio dll嚮導建立dll檔案。建立並匯出乙個名為 fnplug1的函式,引數的空,返回型別為int,如下所示。

#define plug1_api __declspec(dllexport)

extern "c" plug1_api int fnplug1(void);

現在,我們來給dll加入乙個功能以便於觀察到其正常工作。向你的dll函式中加入如下**。

plug1_api int fnplug1(void)

當然,在實際應用中,你需要加入特定的的功能而不是簡單地返回乙個數字。

為了使這個dll檔案作為外掛程式整合進應用程式中,我們需要建立程式來進行驅動。我們的目的是找到所有的dll檔案,對其呼叫loadlibrary()函式,儲存hmodule以供以後引用。

下面給出乙個例子。(注意我們使用.plx副檔名代替了.dll)

void cplugindriverdlg::onload()

else}}

接下來,當你想要反覆呼叫你的外掛程式時,使用對每個外掛程式儲存的hmodule來得到函式的位址,接著利用函式位址呼叫函式。

void cplugindriverdlg::onrunplugins()

{ for(int i=0; i實際上就是這麼簡單。你可以把任意多的外掛程式放到預設的資料夾中;當你準備好後,執行外掛程式中的函式。記住這是乙個很簡單的例子,它可以很簡單地被擴充成健壯的模型,輕鬆載入你所需要的外掛程式。

QML使用dll外掛程式封裝

首先,看了許多例子,都會出現 x module not installed!發的文章也都是抄來抄去,沒啥意思,說的讓人半懂不懂。經過反反覆覆的折騰,終於弄出來了。描述 qt5.11 win10 1.qml檔案並不能完全的隱藏方法。意思就是說你新建了乙個工程,引用這個模組,需要 注 第二個檔名稱為pl...

DLL的設計和使用

目的 vs2019生成dll,codeblock gcc呼叫dll。一 設計生成dll,使用vs2019,step1 先使用vs2019自動生成mfc dll的工程 step2 在dllmain.cpp中新增如下 include windows.h define eof 1 ifdef cplusp...

使用Vim plug作為Vim 外掛程式管理器

ref vundle是一款老款的外掛程式管理工具 vim plug相對較新,特點是支援非同步載入,相比vundle而言 目錄中。在少量外掛程式的時候可以。但當他們安裝更多的外掛程式時,就會變得一團糟。所有外掛程式檔案分散在單個目錄中,使用者無法找到哪個檔案屬於哪個外掛程式。此外,他們無法找到他們應該...