Windows平臺下C++插件系統實現的幾個關鍵技術問題及其解決思路
根據我的實踐,在Windows平臺下設計并實現一個C++插件系統,需要解決幾個關鍵技術問題。下面我談談需要解決的幾個關鍵技術問題以及我想到的簡單的解決思路。由于我主要專注于Windows平臺C++程序的開發,這里假設以VS為編譯環境,MFC界面庫來說明。
1. 主程序和插件的關系問題
插件架構一般可以用下面的圖來表示:
(注:此圖來自李先靜的博客文章:http://blog.csdn.net/absurd/archive/2006/07/04/877063.aspx ,略有修改,特向李大俠表示感謝)
一般來說:應用程序框架所完成的功能應為一個軟件系統的核心和基礎,這些基本功能主要包括一些核心功能,即可為用戶使用,也可為插件使用。插件所完成的功能是對應用程序框架功能的擴展與補充,一般插件完成系列化功能,例如:PHOTOSHOP的濾鏡插件完成對圖形的特殊效果處理,這些功能都有一些共性,可以進行集中管理,并且是可以定義出標準的插件接口。
還有一般更為極端一點:應用程序框架不實現任何具體的功能,只充當一個插件容器。然后由插件實現具體的功能。
2.界面配置問題
界面配置對大家可能不太陌生。在較早的時候我們曾使用ini文件進行界面配置,隨著擴展性更強的XML的興起,使用XML文件進行界面配置逐漸流行起來。
界面配置的實現流程如下:
3.界面和邏輯的結合及消息處理問題
單純的實現對界面的配置并不能算是一個插件系統,插件系統更重要的是如何實現對消息的處理。首先我們要明確在一個系統我們主要要處理哪些消息。我總結了一下,請大家看下表:
其中一個桌面應用系統主要處理的是菜單消息、工具欄按鈕消息、鼠標消息、鍵盤消息、鍵盤消息和系統的其它消息和其它控件消息,如ComboBox控件消息和停靠欄消息。在上面六項中前四項又是主要的。下面我簡單談談菜單消息、工具欄消息、鼠標消息和鍵盤消息的實現思路。
菜單消息和工具欄消息的處理本質是一樣的,就是以ID為標識來尋找命令消息處理函數以及界面更新處理函數。那么用ID和消息處理函數綁定在一起呢?一種辦法是使用boost::bind就行綁定,具體參看我以前寫的一篇博客:巧用boost庫實現字符串映射消息處理函數 。
鼠標和鍵盤消息的響應有三種思路:一種是使用C++的類的虛函數機制,具體是在底層定義一個消息處理對象的基類,在主程序里有一個消息處理對象的基類指針,在插件模塊里實現消息處理對象基類的派生類,并定義一個派生類的變量,在適當的時候將將這個派生類變量的指針賦值給主程序的基類指針,然后這個基類指針負責處理所有的鼠標和鍵盤消息;
第二種思路是使用C++的回調設計模式(關于C++的回調設計模式,這里有一篇很棒的文章:回調設計模式 ),具體是凡是要響應鼠標和鍵 盤消息的插件模塊在初始化時都要注冊回調函數(所謂注冊回調函數主要就是把響應鼠標鍵盤消息的函數指針保存下來),然后在主程序的鼠標鍵盤的響應函數里把該指針取出來調用;第三種思路是使用windows的Hook機制,大致的思路是在插件模塊里使用鉤子來截獲所有窗口的鼠標鍵盤消息,這個思路我還沒有更多的思考,但我想應該是可以的。
拉拉雜雜談了一些插件系統實現的思路,希望能對大家能有所幫助。
from:
根據我的實踐,在Windows平臺下設計并實現一個C++插件系統,需要解決幾個關鍵技術問題。下面我談談需要解決的幾個關鍵技術問題以及我想到的簡單的解決思路。由于我主要專注于Windows平臺C++程序的開發,這里假設以VS為編譯環境,MFC界面庫來說明。
1. 主程序和插件的關系問題
插件架構一般可以用下面的圖來表示:
(注:此圖來自李先靜的博客文章:http://blog.csdn.net/absurd/archive/2006/07/04/877063.aspx ,略有修改,特向李大俠表示感謝)
一般來說:應用程序框架所完成的功能應為一個軟件系統的核心和基礎,這些基本功能主要包括一些核心功能,即可為用戶使用,也可為插件使用。插件所完成的功能是對應用程序框架功能的擴展與補充,一般插件完成系列化功能,例如:PHOTOSHOP的濾鏡插件完成對圖形的特殊效果處理,這些功能都有一些共性,可以進行集中管理,并且是可以定義出標準的插件接口。
還有一般更為極端一點:應用程序框架不實現任何具體的功能,只充當一個插件容器。然后由插件實現具體的功能。
2.界面配置問題
界面配置對大家可能不太陌生。在較早的時候我們曾使用ini文件進行界面配置,隨著擴展性更強的XML的興起,使用XML文件進行界面配置逐漸流行起來。
界面配置的實現流程如下:
3.界面和邏輯的結合及消息處理問題
單純的實現對界面的配置并不能算是一個插件系統,插件系統更重要的是如何實現對消息的處理。首先我們要明確在一個系統我們主要要處理哪些消息。我總結了一下,請大家看下表:
其中一個桌面應用系統主要處理的是菜單消息、工具欄按鈕消息、鼠標消息、鍵盤消息、鍵盤消息和系統的其它消息和其它控件消息,如ComboBox控件消息和停靠欄消息。在上面六項中前四項又是主要的。下面我簡單談談菜單消息、工具欄消息、鼠標消息和鍵盤消息的實現思路。
菜單消息和工具欄消息的處理本質是一樣的,就是以ID為標識來尋找命令消息處理函數以及界面更新處理函數。那么用ID和消息處理函數綁定在一起呢?一種辦法是使用boost::bind就行綁定,具體參看我以前寫的一篇博客:巧用boost庫實現字符串映射消息處理函數 。
鼠標和鍵盤消息的響應有三種思路:一種是使用C++的類的虛函數機制,具體是在底層定義一個消息處理對象的基類,在主程序里有一個消息處理對象的基類指針,在插件模塊里實現消息處理對象基類的派生類,并定義一個派生類的變量,在適當的時候將將這個派生類變量的指針賦值給主程序的基類指針,然后這個基類指針負責處理所有的鼠標和鍵盤消息;
第二種思路是使用C++的回調設計模式(關于C++的回調設計模式,這里有一篇很棒的文章:回調設計模式 ),具體是凡是要響應鼠標和鍵 盤消息的插件模塊在初始化時都要注冊回調函數(所謂注冊回調函數主要就是把響應鼠標鍵盤消息的函數指針保存下來),然后在主程序的鼠標鍵盤的響應函數里把該指針取出來調用;第三種思路是使用windows的Hook機制,大致的思路是在插件模塊里使用鉤子來截獲所有窗口的鼠標鍵盤消息,這個思路我還沒有更多的思考,但我想應該是可以的。
拉拉雜雜談了一些插件系統實現的思路,希望能對大家能有所幫助。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成