使用VC++ ATL實現iStylePDF的COM外掛

dbqs8710發表於2014-08-11

本文介紹了一種使用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章