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

Excel2000/XP和PowerPoint2000/XP內部COM插件的實現

編輯:關於VC++

一、簡介

Excel2000和PowerPoint2000下內部COM插件的編程實現這篇文章,實際上是< Office2000下內部COM插件的編程實現> 和< Word2000/XP中內部COM插件的編程實現>二篇文章的續篇。采用上篇文章< Word2000/XP中內部COM插件的編程實現>中寫作風格,不再重復哆嗦大部分前面文章裡已經講過的內容了,只將重點放在它們間實現的不同點上,有興趣的朋友可以參看前面二篇文章,然後再看這篇文章及示例源碼一定會倍感輕松。本文章提供的Excel2000插件和PowerPoint2000插件的二個示例源碼運行後的效果圖如下所示:

二、具體實現

下面,讓我們來看看如何最小化修改原基礎上的源碼來實現一個Excel2000和PowerPoint2000下COM插件,建立工程及其它步驟可根據前面二篇文章中介紹的內容進行操作。在這裡,除了下面介紹的源碼內容需要改動處,其它部分的源碼內容基本上和前面我講的文章中的示例源碼相同,一般並不需要改動(除非你有其它方面的特殊需求)。

第一點:在文件中Stdafx.h中的類型的導入庫部分源碼將有所不同,可將源文件中源碼替換為下面部分既可。

Excel2000下:

/////////////////////////////////////////////////////////////////////////////////
/* 導入工程所需Office2K及Excel2K類型庫,其*/
/* 中路徑可根據安裝路徑自行設定, jingzhou xu  */
/******************* 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;
// Excel導入庫
#import "E:\\Program Files\\Microsoft Office\\Office\\EXCEL9.olb" rename("RGB","RGBEx"),
rename("DialogBox","DialogBoxEx"),named_guids,rename_namespace("MSExcel")
using namespace MSExcel;

PowerPoint2000下:

/////////////////////////////////////////////////////////////////////////////////
/* 導入工程所需Office2K及PowerPoint2K類型庫,其*/
/* 中路徑可根據安裝路徑自行設定, jingzhou xu  */
/******************* 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;
// PowerPoint導入庫
#import "E:\\Program Files\\Microsoft Office\\Office\\MSPPT9.OLB" named_guids,rename_namespace("MSPPT")
using namespace MSPPT;

第二點:注冊類型信息有所不同(*.rgs),將文件rgs中內容的下半部分修改如下所示:

Excel2000下:

HKCU
{
 Software
 {
  Microsoft
  {
   Office
   {
    Excel
    {
     Addins
     {
      ''ExcelAddin.Excel2000Addin''
      {
       val FriendlyName = s ''Excel20002000 Addin''
       val Description = s ''Excel20002000下插件''
       val LoadBehavior = d ''00000003''
       val CommandLineSafe = d ''00000001''
      }
     }
    }
   }
  }
 }
}

PowerPoint2000下:

HKCU
{
 Software
 {
  Microsoft
  {
   Office
   {
    PowerPoint
    {
     Addins
     {
      ''PPTAddin.PowerPoint2000Addin''
      {
       val FriendlyName = s ''PowerPoint2000 Addin''
       val Description = s ''PowerPoint2000下插件''
       val LoadBehavior = d ''00000003''
       val CommandLineSafe = d ''00000001''
      }
     }
    }
   }
  }
 }
}

第三點:Excel2000和PowerPoint2000中沒有ActiveExplorer對象,所以不必再經過它獲取CommandBars,直接從_Application中獲得CommandBars對象進行操作。修改部分如下面源碼所示:

Excel2000下:

// 裝缷插件時處理
STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)
{
    CComPtr < Office::_CommandBars> spCmdBars;
    // Excel應用接口_Application
    CComQIPtr<MSExcel::_Application> spApp(Application);
    ATLASSERT(spApp);

    // 獲取CommandBars接口
    HRESULT hr = spApp->get_CommandBars(&spCmdBars);
    if(FAILED(hr))
      return hr;
    ATLASSERT(spCmdBars);
    // ……
}

PowerPoint2000下:

// 裝缷插件時處理
STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)
{
    CComPtr < Office::_CommandBars> spCmdBars;
    // Word應用接口_Application
    CComQIPtr<MSPPT::_Application> spApp(Application);
    ATLASSERT(spApp);

    // 獲取CommandBars接口
    HRESULT hr = spApp->get_CommandBars(&spCmdBars);
    if(FAILED(hr))
      return hr;
    ATLASSERT(spCmdBars);
    // ……
}

好了,Excel2000、PowerPoint2000、Word2000和Outlook2000下的內部COM插件實現的不同點主要就這些了,具體實現的詳細代碼可參看幾篇文章所附帶示例源碼,內有詳細注釋。

參考文獻:

Office2000下內部COM插件的編程實現 -- 徐景周(譯者)

Word2000/XP中內部COM插件的編程實現 – 徐景周

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

本文配套源碼

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