程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Word2000/XP中內部COM插件的編程實現

Word2000/XP中內部COM插件的編程實現

編輯:關於VC++

簡介

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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved