天天看點

Access2000下内部COM插件的程式設計實作

Access2000下内部COM插件的程式設計實作

作者:徐景周

下載下傳示例代碼( http://www.vckbase.com/document/viewdoc.asp?id=826 )

簡介

在這裡,我們仍然使用VC6中的ATL來實作Access2000下的内部COM插件,至于其基本原理和詳細的實作方法及步驟,可以參看前面我的文章< Office2000下内部COM插件的程式設計實作>等,這裡隻重點說明它和其它Office2000中内部COM插件(如:Word2000、Excel2000、PowerPoint2000、Outlook2000)實作的不同之處,文章及示例代碼都可以在http://www.vckbase.com網站中找到。下面是Access2000内部COM插件示例代碼運作後的效果圖:

具體實作

打開VC6.0,在建立工程中選中ATL COM Appwizard,在右側工程名中輸入AccessAddin,點選Finish(完成)按鈕完成工程建立。接着,選取菜單Insert->New ATL Objec項,在彈出的ATL對象向導對話框中選中相應Objects對應右側的Simple Object選項,點選下一步,在彈出的對話框中ShortName中輸入AcceAddin,點OK完成插入ATL對象。

接着通過導入類型庫來實作_IDTExtensibility2接口,編釋好上面所建工程後,在ClassView中的CAcceAddin類上點滑鼠右鍵,在彈出的右鍵菜單中選Implement Interface項。在彈出的實作接口對話框中點選Add Typelib,在彈出的Browse Type Libraries對話框中,向下滾動選取Microsoft Add-in Designer(1.0)子項,點OK按鈕。在彈出的接口清單對話框中選中_IDTExtensibility2接口,點OK按鈕完成導入。系統會自動為你生成空的上面所提到的五個所需接口涵數。

下面來看看它們之間實作的不同點。

第一點:注冊類型資訊有所不同(*.rgs),在檔案AcceAddin.rgs中内容的下面,添加所下代碼:

HKCU

{

      Software

       {

              Microsoft

              {

                     Office

                     {

                            Access

                            {

                                   Addins

                                   {

                                          'AccessAddin.AcceAddin'

                                          {

                                                 val FriendlyName = s 'Access2000插件'

                                                 val Description = s '使用ATL開發的Access2000的内部插件'

                                                 val LoadBehavior = d '00000003'

                                                 val CommandLineSafe = d '00000000'

                                          }

                                   }

                            }

                     }

              }

       }

}

第二點:在檔案中Stdafx.h中的類型的導入庫部分源碼将有所不同,可在Stdafx.h中添加下面代碼。

#pragma warning(disable:4146)     // 暫時屏蔽編譯時4146警告資訊

// 導入Access2000所需類型庫ADO、DAO、VBE、OFFICE及ACCESS庫(具體路徑可根據實際情況自行設定,jingzhou xu)

#import "D://Program Files//Common Files//system//ado//msado21.tlb" no_namespace /

rename ("EOF", "adoEOF")

#import "D://Program Files//Common Files//Microsoft Shared//DAO//DAO360.DLL" rename("EOF","EndOfFile") /

rename("BOF","BegOfFile")

#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/MSACC9.OLB" named_guids,rename_namespace("MSACCESS")

using namespace MSACCESS;

#pragma warning(default:4146)     // 恢複編譯時4146警告資訊

第三點:Access2000中沒有ActiveExplorer對象,是以不必象Outlook2000一樣要經過它來擷取CommandBars,可以直接從_Application中獲得CommandBars對象進行操作。修改部分如下面源碼所示:

    // 裝缷插件時處理, jingzhou xu

    STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)

    {

           CComPtr < Office::_CommandBars> spCmdBars;

           // Access應用接口_Application

           CComQIPtr<MSACCESS::_Application> spApp(Application);

           ATLASSERT(spApp);

           // 擷取CommandBars接口

           HRESULT hr = spApp->get_CommandBars(&spCmdBars);

           if(FAILED(hr))

                  return hr;

           ATLASSERT(spCmdBars);

           // 新增一個工具條及其上一個位圖按鈕

           CComVariant vName("新增Access2000工具條插件");

           CComPtr <Office::CommandBar> spNewCmdBar;

           // 新增工具條位置

           CComVariant vPos(1);

           CComVariant vTemp(VARIANT_TRUE); // 臨時       

           CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);              

           // 用Add方法在指定位置新增一工具條并讓spNewCmdBar指向它

           spNewCmdBar = spCmdBars->Add(vName, vPos, vEmpty, vTemp);

           // 擷取新增工具條的CommandBarControls,進而在其上添加按鈕

           CComPtr < Office::CommandBarControls> spBarControls;

           spBarControls = spNewCmdBar->GetControls();

           ATLASSERT(spBarControls);

           // MsoControlType::msoControlButton = 1

           CComVariant vToolBarType(1);

           // 顯示工具條

           CComVariant vShow(VARIANT_TRUE);

           CComPtr < Office::CommandBarControl> spNewBar;

           // 用CommandBarControls中的Add方法新增第一個按鈕,并讓spNewBar指向它

           spNewBar = spBarControls->Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow);

           ATLASSERT(spNewBar);

           // 為每一個按鈕指定_CommandBarButton接口,從面可以指定按鈕的顯示風格等

           CComQIPtr < Office::_CommandBarButton> spCmdButton(spNewBar);

           ATLASSERT(spCmdButton);

           // 設定位圖按鈕風格,位圖為32x32大小,将其放入剪切闆中,用PasteFace()貼在指定按鈕上

           HBITMAP hBmp =(HBITMAP)::LoadImage(_Module.GetResourceInstance(),

                  MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);

           ::OpenClipboard(NULL);

           ::EmptyClipboard();

           ::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);

           ::CloseClipboard();

           ::DeleteObject(hBmp);          

           // 粘貼前設定顯示風格

           spCmdButton->PutStyle(Office::msoButtonIconAndCaption);

           hr = spCmdButton->PasteFace();

           if (FAILED(hr))

                  return hr;

           spCmdButton->PutVisible(VARIANT_TRUE);

           spCmdButton->PutCaption(OLESTR("按鈕1"));

           spCmdButton->PutEnabled(VARIANT_TRUE);

           spCmdButton->PutTooltipText(OLESTR("按鈕1提示資訊"));

           spCmdButton->PutTag(OLESTR("按鈕1标志資訊"));

           // 顯示新增工具條

           spNewCmdBar->PutVisible(VARIANT_TRUE);

           m_spButton = spCmdButton;

           // 激活新增的工具條按鈕的事件連接配接點

           m_spApp = spApp;

        hr = CommandButton1Events::DispEventAdvise((IDispatch*)m_spButton);

           if(FAILED(hr))

                  return hr;

           ::EmptyClipboard();

           return S_OK;

    }

       不同之處,主要是以上三點,至于其它部分,如工具條按鈕CommandBarButton派發接口的響應事件、打開或斷開與接口的連接配接方法等都沒有太大變化,其具體實作前面的文章已經介紹過了,有興趣的朋友可以參看下面參考文獻中的幾篇有關Office2000下内部COM插件的程式設計實作文章,然後再看這篇文章及示例源碼一定會倍感輕松。

參考文獻:

Office2000下内部COM插件的程式設計實作 -- 徐景周

Word2000/XP中内部COM插件的程式設計實作 -- 徐景周

Excel2000/XP和PowerPoint2000/XP下内部COM插件的實作 -- 徐景周

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

聯系方式:

編者EMAIL:[email protected]

未來工作室(Future Studio)

繼續閱讀