一、簡介
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
本文配套源碼