Word2000/XP中內部COM外掛的程式設計實現 (轉)

worldblog發表於2007-12-14
Word2000/XP中內部COM外掛的程式設計實現 (轉)[@more@]

2000/XP中內部COM的實現

編譯:徐景周

:namespace prefix = o ns = "urn:schemas--com::office" />

示例原始碼(?paper_id=734)

簡介

Office2000/XP中Word下的內部COM外掛的實現方法和前面我的文章< Office2000下內部COM外掛的程式設計實現>中介紹的示例2000下內部COM外掛的實現方法與步驟基本相同,在這裡,我想不用再重複哆嗦大部分前面文章裡已經講過的內容了,只將重點放在它們間實現的不同點上,有興趣的朋友可以參看前面這篇文章,然後再看這篇文章一定會事半功倍的。本文章提供的Word內部COM外掛示例原始碼執行後的效果圖如下所示:

具體實現

  下面,讓我們來看看它們間(Word2000 vs Outlook2000內部COM外掛)的實現內容到底有什麼不同呢?可以先建一個ATL工程,起名WordAddin,再插入一個簡單,起名IWord2000Addin,其它步驟可參看前面我講的文章中介紹的內容進行操作。在這裡,除了下面介紹的原始碼內容需要改動處,其它部分的原始碼內容基本上和前面我講的文章中的示例原始碼相同,一般並不需要改動(除非你有其它方面的特殊需求)。

第一點:在中Stdafx.h中的型別的匯入部分原始碼將有所不同,可將原始檔中原始碼替換為下面部分既可。

// 匯入工程所需Office2K及Word2K型別庫(路徑可根據路徑自行設定), jingzhou xu

/* Office XP下匯入如下:  */

//#import "C:Program FilesCommon FilesMicrosoft SharedOffice10MSO.DLL" rename_namespace("Office")

//using namespace Office;

//#import "D:Program FilesCommon FilesMicrosoft SharedVBAVBA6VBE6EXT.olb" rename_namespace("VBE6")

//using namespace VBE6;

//#import "D:Program FilesMicrosoft OfficeOffice10MSWORD.olb" rename("Exit","ExitWindowsEx"),named_guids,rename_namespace("MSWord")

//using namespace MSWord;

/* Office 2000下匯入使用 */

#import "E:Program FilesMicrosoft OfficeOfficemso9.dll" rename_namespace("Office")

using namespace Office;

#import "D:Program FilesCommon FilesMicrosoft SharedVBAVBA6VBE6EXT.olb" rename_namespace("VBE6")

using namespace VBE6;

#import "E:Program FilesMicrosoft OfficeOfficeMSWORD9.olb" rename("ExitWindows","ExitWindowsEx"),named_guids,rename_namespace("MSWord")

using namespace MSWord;

  第二點:註冊型別資訊有所不同(*.rgs),如將檔案Word2000Addin.rgs中內容的下半部分修改如下所示:

  HKCU

{

  Software

  {

  Microsoft

  {

  Office

  {

  Word

  {

  Addins

  {

  'WordAddin.Word2000Addin'

  {

  val FriendlyName = s 'Word2000 Addin'

  val Description = s 'Word2000 Addin'

  val Loaehavior = d '00000003'

  val CommandLineSafe = d '00000001'

  }

  }

  }

  }

  }

  }

}

  第三點:Word2000/XP中沒有ActiveExplorer物件,所以可以不再經過它,直接從_Application中獲得Commanrs物件進行操作。修改部分如下面原始碼所示:

  // 裝缷外掛時處理

  STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)

  {

  CComPtr < Office::_CommandBars> spCmdBars;

  // Word應用介面_Application

  CComQIPtr<:_application> spApp(Application);

  SERT(spApp);

 

  // 獲取CommandBars介面

  HRESULT hr = spApp->get_CommandBars(&spCmdBars);

  if(FAILED(hr))

  return hr;

  ATLASSERT(spCmdBars);

  。。。。。。

  。。。。。。

  }

好了,Word2000/XP下和Outlook2000下的內部COM外掛實現的不同點主要就這些了,具體實現的詳細程式碼可參看兩篇文章所附帶示例原始碼,內有詳細註釋。

  最後,我想再補充一點的是,由於Office97及其以下版本不支援內部COM外掛介面(特別是IDTExtensibility2介面),所以以上在Word97中並不適用。為了能在Word97下也能用,我們可以採用另一種方法:既VBA+ATL外掛來實現.在用ATL程式設計時由於沒有IDTExtensibility2介面支援,所以不能再用OnConnection()OnDinnection介面涵數來實現在裝載外掛和解除安裝外掛時的操作。我們可以在在工程中建立兩個介面涵數,如名為:Init()和Uninit(),把它們當做上面所提到的兩個裝載、解除安裝介面涵數,可以在Init()中加入實現插入工具條按鈕部分,程式碼大致和本文示例相同,Uninit()中實現取消操作。然後可以建一Word模板(*.dot),在其中插入VBA來實現建立並載入、解除安裝的方法,如下面VBA原始碼:

Dim o as Application

Dim obj as

Sub AutoExec()

Set obj = CreateObject("Word97Addin.Addin")

Set o = ThisDocument.Application

obj.Init o

End Sub

Sub AutoExit()

Set o = ThisDocument.Application

obj.Uninit o

Set obj = Nothing

Set o = Nothing

End Sub

  由於這些並不是本篇文章的重點(重點是實現Word2000/XP下內部COM外掛),所以,在這裡我就不必再詳細討論了,有興趣的讀者可以參考其它相關資料。

參考文獻:

Office2000下內部COM外掛的程式設計實現 -- 徐景周(譯者)

Writing an MS Word addin -- Amit Dey

ATL開發指南(第二版) -- Tom Armstrong & Ron Patton

聯絡方式:

地址:陝西省西安市勞動路2號院六單元

郵編:710082

編者E:

未來工作室(Future Studio)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993235/,如需轉載,請註明出處,否則將追究法律責任。

相關文章