使用VC++ ATL實現iStylePDF的COM外掛
本文介紹了一種使用VC++ ATL(Active Template Library),利用ISPExtensibility介面,為 iStylePDF 加入功能簡單的COM外掛(addin),加入工具欄按鈕等可視部件,併為其加入響應事件的方法。我們採用VS2010為iStylePDF平臺開發外掛,當然也可以使用其他VS工具。開發外掛的第一步需要安裝iStylePDF的客戶端,客戶端程式中包括了ActiveX控制元件,這個是我們需要用到的型別庫。如果沒有客戶端,請進入下載。下面開始逐步介紹開發步驟。
1、在visual C++程式設計環境下,利用嚮導生成一個名為PDFAddin的ATL COM Appwizard工程(圖一):
在嚮導的設定中採用預設設定,選擇Next。然後單擊Finish,這樣一個空的ATL project就產生了(如圖二)。
2、插入一個ATL的簡單物件:
選擇選單Project—>Add Class...,出現類嚮導對話方塊(如圖三),單擊Add:
輸入簡單物件類名稱,如PDFReader。注意一點的地方是VS2010 ProgID自己填寫,這個名字很重要,最後編譯生成的檔名稱必須用這個命名。示例所示為iStylePDF.PDFReader。最後編譯的控制元件名稱為iStylePDF.PDFReader.spi(如圖四),單擊Next。
檔案型別選項採用預設值。選項頁的設定根據自己的需要是否設定連線點和ISupportErrorInfo支援,其他採用預設值即可。(如圖五),單擊完成。一個基本的COM元件就建立了,編譯該工程看是否正常。現在該控制元件還沒有和iStylePDF關聯起來。接下來是重點設定。
3、在CPDFReader類中實現ISPExtensibility的介面:
ISPExtensibility是iStylePDF型別庫中的一個虛介面類。外掛程式的CPDFReader只要繼承並實現該類的幾個介面就能和宿主程式關聯。新增繼承虛介面類步驟如下,首先選擇類檢視,找到ATL的簡單物件類,右鍵單擊彈出選單,選擇Add->Implement Interface。如圖六
可用的型別庫名稱中選擇iStylePDF Object Library<1.0>,如果型別庫中沒有,說明控制元件沒有註冊,也可以從檔案選擇iStylePDF.ocx。介面中選擇ISPExtensibility,移動到右邊的實現介面類中,單擊完成。如圖七。
現在就自動新增了ISPExtensibility介面類的介面函式,OnConnection,OnDisconnection主要使用這兩個函式。修改輸出檔名稱,編譯成功之後。即可放到iStylePDF安裝目錄的plugins目下,平臺啟動就會載入該外掛。目前外掛什麼功能都沒有實現,所以什麼看不到,下面介紹新增一個工具條。
4、新增工具欄按鈕:
新增工具欄按鈕可以再程式連線的函式中實現。OnConnection引數是一個Application頂級物件,透過該物件可以獲取所有的其他物件。請參考物件模型。我們定義一個變數把Application指標儲存起來。
OnConnection的實現如下程式碼:
CommandBar的函式說明請參考物件模型。編譯執行工具欄就加進去了。如圖九
5、按鈕事件的新增:
按鈕新增了,需要接收按鈕的事件,下面就是要介紹實現Event的響應。ATL為COM物件的Idispatch介面提供了兩個模板類:IDispEventImpl<>和IDispEventSimpleImpl<>,選擇IDispEventSimpleImpl<>,因為它不需要額外的型別庫資訊,從IDispEventSimpleImpl<>繼承一個類:
然後再新增事件對映宏即可接收事件。
BEGIN_SINK_MAP(CPDFReader) END_SINK_MAP()
接下來我們要做的是為按鈕加單擊事件。 首先要用_ATL_SINK_INFO結構描述回撥的引數資訊,必須宣告為外部變數,我們為事件預定義了一些引數說明,如下:
宣告按鈕點選事件的回撥函式:
然後在事件對映處新增事件對映:
編譯執行。點選按鈕,沒有彈出對話方塊。嗯,這樣就對了,我們還有一個步驟沒做。增加事件類的DispEventAdvise。 在連線函式中增加如下程式碼:
別忘了,在斷開連線的地方釋放事件響應:
好了,一個外掛就完成了,親們, 趕緊去試試吧,不懂的地方,請猛點這裡。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29762980/viewspace-1249173/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VC++、MFC、COM和ATL的區別C++
- 不用ATL框架純手工實現COM程式外回撥框架
- VC++實現COM事件接收器C++事件
- 使用spring外掛實現策略模式Spring模式
- PHP外掛系統的實現(七):外掛案例PHP
- 使用Maven的assembly外掛實現自定義打包Maven
- PHP外掛系統的實現(五):觸發外掛PHP
- 使用ATL建立支援IClassFactory2的COM元件 (轉)元件
- SDK 開發使用 VirtualAPK 實現外掛化APK
- 【Maven實戰技巧】「外掛使用專題」Maven-Assembly外掛實現自定義打包Maven
- 用 Thunk 實現 COM 的掛鉤
- javascript實現的微信分享外掛JavaScript
- jQuery實現的cookie操作外掛jQueryCookie
- PHP外掛系統的實現(二):獲取全部外掛資訊PHP
- PHP外掛系統的實現(一)PHP
- jQuery實現的元素抖動外掛jQuery
- 實現TensorRT-7.0外掛自由!(如果不踩坑使用TensorRT外掛功能)
- QQ搶紅包外掛實現
- fastadmin的【外掛管理】外掛使用教程AST
- 關於 laravel-like-comment評論外掛的使用Laravel
- IDEA的Docker外掛實戰(Docker-compose篇)IdeaDocker
- 實現元素動畫的6款 JavaScript 外掛動畫JavaScript
- PHP smarty的ubb外掛實現彩字PHP
- PHP外掛系統的實現(三):實現探測器PHP
- PhotoSwipe外掛的使用
- JavaScript原生實現樓梯外掛JavaScript
- 手動實現HTML外掛BeautifyHTML
- 使用流水線外掛實現持續整合、持續部署
- HtmlWebpackPlugin外掛和HtmlWebpackInlineSourcePlugin外掛的使用HTMLWebPlugininline
- Word2000/XP中內部COM外掛的程式設計實現 (轉)程式設計
- 外掛化知識梳理(10) Service 外掛化實現及原理
- Composer釋出自己的外掛包
- 配置vim外掛遇到youcompleteme外掛問題解決方案
- PHP外掛系統的實現(四):實現註冊動作PHP
- 外掛化知識梳理(4) Small 框架之如何實現外掛更新框架
- JQuery外掛定義&&談談jquery的實現jQuery
- 非常簡單的使用jqueryfancybox外掛實現的檢視圖片效果jQuery
- Office2000下內部COM外掛的程式設計實現(之二) (轉)程式設計