簡介
Office2000/XP中Word下的內部COM插件的實現方法和前面我的文 章《 Office2000下內部COM插件的編程實現》中介紹的示例Outlook2000下內部 COM插件的實現方法與步驟基本相同,在這裡,我想不用再重復哆嗦大部分前面 文章裡已經講過的內容了,只將重點放在它們間實現的不同點上,有興趣的朋友 可以參看前面這篇文章,然後再看這篇文章一定會事半功倍的。本文章提供的 Word內部COM插件示例源碼運行後的效果圖如下所示:
具體實現
下面,讓我們來看 看它們間(Word2000 vs Outlook2000內部COM插件)的實現內容到底有什麼不同呢 ?可以先建一個ATL工程,起名WordAddin,再插入一個簡單對象,起名 IWord2000Addin,其它步驟可參看前面我講的文章中介紹的內容進行操作。在這 裡,除了下面介紹的源碼內容需要改動處,其它部分的源碼內容基本上和前面我 講的文章中的示例源碼相同,一般並不需要改動(除非你有其它方面的特殊需求) 。
第一點:在文件中Stdafx.h中的類型的導入部分源碼將有所不同,可 將源文件中源碼替換為下面部分既可。
// 導入工程所需Office2K 及Word2K類型庫(路徑可根據安裝路徑自行設定), jingzhou xu
/* Office XP下導入如下: */
//#import "C:\Program Files\\Common Files\\Microsoft Shared\\Office10\\MSO.DLL" rename_namespace ("Office")
//using namespace Office;
//#import "D:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6 \\VBE6EXT.olb" rename_namespace("VBE6")
//using namespace VBE6;
//#import "D:\Program Files\Microsoft Office\Office10\MSWORD.olb" rename ("ExitWindows","ExitWindowsEx"),
//named_guids,rename_namespace("MSWord")
//using namespace MSWord;
/* Office 2000下導入使用 */
#import "E:\\Program Files\\Microsoft Office\\Office\\mso9.dll" rename_namespace("Office")
using namespace Office;
#import "D:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace ("VBE6")
using namespace VBE6;
#import "E:\\Program Files\\Microsoft Office\\Office\\MSWORD9.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 LoadBehavior = d ''00000003''
val CommandLineSafe = d ''00000001''
}
}
}
}
}
}
}
第三點: Word2000/XP中沒有ActiveExplorer對象,所以可以不再經過它,直接從 _Application中獲得CommandBars對象進行操作。修改部分如下面源碼所 示:
// 裝缷插件時處理
STDMETHOD(OnConnection) (IDispatch * Application,
ext_ConnectMode ConnectMode,
IDispatch * AddInInst,
SAFEARRAY * * custom)
{
CComPtr < Office::_CommandBars> spCmdBars;
// Word 應用接口_Application
CComQIPtr<MSWord::_Application> spApp(Application);
ATLASSERT(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()和OnDisconnection接口涵數來實現在裝載插件和卸載插件時的 操作。我們可以在在工程中創建兩個接口涵數,如名為:Init()和Uninit(),把 它們當做上面所提到的兩個裝載、卸載接口涵數,可以在Init()中加入實現插入 工具條按鈕部分,代碼大致和本文示例相同,Uninit()中實現取消操作。然後可 以建一Word模板(*.dot),在其中插入VBA來實現創建並加載、卸載組件的方法, 如下面VBA源碼:
Dim o as Application
Dim obj as Object
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
本文配套源碼