Word的COM載入項開發指南

weixin_45303938發表於2020-10-03

所謂程式外掛(add-in),是指根據主程式的SDK製作出的程式模組。這個模組必須做到以下兩點:實現主程式SDK定義的某種介面(不一定是COM介面);必須以某種形式註冊,如寫入特定登錄檔資訊或者存放在主程式規定的特定路徑下。實現上述兩點後,主程式執行時,就會根據註冊方式找到外掛模組,並根據實現的介面載入它。這樣,程式外掛就插入到主程式的執行程式中,並可以實現自己的功能了。

之前介紹的基於Word客戶端的電子印章系統,就是典型的程式外掛,它被載入到Word的程式,在Word的編輯環境中加入了自己的選單,並實現了針對Word文件的簽章、驗證等功能。在這裡插入圖片描述
今天介紹一下它的實現過程,希望對大家以後做類似功能的開發有所幫助。

實現介面

因為Word程式外掛是COM控制元件,所以在Word裡把這種外掛叫COM載入項。它需要實現型別庫Microsoft Add-in Designer的介面IDTExtensibility2,這個型別庫對應的檔案是MSADDNDR.DLL,它預設的位置在:程式安裝路徑\Common Files\DESIGNER目錄裡,安裝了微軟的Office就會有此檔案(其實IDTExtensibility2介面最開始是用於Visual Studio IDE工具的擴充開發的)。

首先需引用此型別庫。如果使用VC開發,可以通過實現介面嚮導引用,如下圖。在這裡插入圖片描述
注意,通過嚮導新增後,在stdafx.h裡的輸入語句是開發機器上MSADDNDR.DLL的絕對路徑,比如:

#import “C:\Program Files (x86)\Common Files\DESIGNER\MSADDNDR.DLL” raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search

因此,需要將#import 的內容改為使用型別庫ID,如下:

#import “libid:AC0714F2-3D04-11D1-AE7D-00A0C90F26F4” raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search

型別庫ID可以通過在IDTExtensibility2介面上點選右鍵去到其定義MSADDNDR.tlh裡查詢。

當然,你也可以手工地在stdafx.h里加入上述語句,並在外掛類的宣告裡加上如下實現介面宣告:

public IDispatchImpl<_IDTExtensibility2, &__uuidof(_IDTExtensibility2), &LIBID_AddInDesignerObjects, /* wMajor = */ 1>.

如果是使用VB開發,直接新增引用即可。在這裡插入圖片描述
接下來就是實現介面了, IDTExtensibility2定義了五個介面函式用於外掛與主程式的通訊,其說明如下表:在這裡插入圖片描述
上述介面函式中,最重要的就是OnConnection和OnStartupComplete.在OnConnection的實現程式碼中,外掛可以通過Object引數獲得主程式物件,由此就可以訪問主程式並呼叫其各種屬性、方法。在OnStartupComplete中,因為此時已載入完畢,外掛可以實現各種預定的功能了。其他介面可用於一些變數的初始化和記憶體釋放工作,如果確實無事可做,直接返回即可。因此,我們可以在實現OnConnection介面的方法裡獲得Word程式物件,在實現OnStartupComplete介面的方法裡訪問、操作這個物件,從而實現外掛的功能。至於Word程式物件有哪些屬性方法等介面可以呼叫,就屬於Word二次開發的內容了,本文不再展開。

註冊外掛

Word採用記錄登錄檔方式註冊外掛,登錄檔位置如下:HKEY_CURRENT_USER\Software\Microsoft\Office\Word\AddIns或HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Word\Addins.

如果外掛是對當前使用者有效就用前者,如果對所有使用者生效就用後者。如果是64位系統中安裝的32位Word,那登錄檔路徑相應改為HKEY_CURRENT_USER\Software\Wow6432Node \Microsoft\Office\Word\AddIns或HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node \Microsoft\Office\Word\Addins.

在上述登錄檔位置下,每一個外掛為一個子項,外掛類的ProgID為子項的名稱,如下圖:在這裡插入圖片描述
其中,“WordClient7.WordAddin”是外掛的控制元件類名,常用的有以下幾個鍵值

Description:外掛的簡短描述。

FriendlyName:是在“COM載入項”對話方塊中顯示的外掛名稱。

LoadBehavior:外掛的載入方式,它由以下幾個值組合而成: 0表示不載入、1表示載入、2表示程式啟動時採取動作、8表示需要時採取動作、16表示首次連線時採取動作。所以一般設定為3,表示Word啟動時載入。

CommandLineSafe:標識外掛是不是命令列安全的,一般設定成0.

按照上述方式設定登錄檔值後,外掛就可以整合在Word中使用了。我們可以在Word的COM載入項視窗中管理這些外掛,如下圖。在這裡插入圖片描述
Excel、WPS也採用類似的外掛註冊方式。其中,高版本的WPS文字甚至可以直接使用Word的外掛註冊資訊,作為其自身的外掛。大家可以自行研究。

相關文章