Access2000下内部COM插件的编程实现

关键字 com
原作者姓名 徐景周
文章原始出处 未来工作室(Future Studio)
出版社 未来工作室(Future Studio)

介绍
Access2000下内部COM插件的编程实现

读者评分 10 评分次数 2

正文
Access2000下内部COM插件的编程实现
作者:徐景周

下载示例代码

简介
在这里,我们仍然使用VC6中的ATL来实现Access2000下的内部COM插件,至于其基本原理和详细的实现方法及步骤,可以参看前面我的文章< Office2000下内部COM插件的编程实现>等,这里只重点说明它和其它Office2000中内部COM插件(如:Word2000、Excel2000、PowerPoint2000、Outlook2000)实现的不同之处,文章及示例代码都可以在 http://www.vckbase.com 网站中找到。下面是Access2000内部COM插件示例代码运行后的效果图:

说明 Access.jpg

具体实现
打开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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值