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

原创 2003年09月12日 19:28:00

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

作者:徐景周

 

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

 

简介

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

 

 

具体实现

打开VC6.0,在新建工程中选中ATL COM Appwizard,在右侧工程名中输入AccessAddin,点击Finish(完成)按钮完成工程创建。接着,选取菜单Insert->New ATL Objec项,在弹出的ATL对象向导对话框中选中相应Objects对应右侧的Simple Object选项,点击下一步,在弹出的对话框中ShortName中输入AcceAddinOK完成插入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所需类型库ADODAOVBEOFFICEACCESS(具体路径可根据实际情况自行设定,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/XPPowerPoint2000/XP下内部COM插件的实现 -- 徐景周

ATL开发指南(第二版) -- Tom Armstrong & Ron Patton

 

联系方式:

地址:陕西省西安市劳动路2号院六单元

邮编:710082

编者EMAIL:jingzhou_xu@163.net

未来工作室(Future Studio)

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

关键字 com原作者姓名 徐景周文章原始出处 未来工作室(Future Studio)出版社 未来工作室(Future Studio) 介绍Access2000下内部COM插件的编程实现 读者评分 1...
  • wovow
  • wovow
  • 2004年12月25日 21:09
  • 869

VC++内部COM插件的编程实现

 VC++内部COM插件的编程实现2006-04-05 09:09作者:李晓飞出处:VCKBASE责任编辑:方舟 http://dev.yesky.com/308/2359308.shtml  一、闲...
  • momentt
  • momentt
  • 2008年12月15日 16:19
  • 438

Office2000下内部COM插件的编程实现(之二)

 在Office应用程序中,尽管菜单和工具栏按钮看上去不太一样,但实质上它们是相同类型的对象。CommandBars集合包含程序中的所有命令条,如:工具条和菜单条。每一个CommandBars集合都有...
  • jz_x
  • jz_x
  • 2003年02月08日 12:01
  • 1481

Office2000下内部COM插件的编程实现(之一)

Office2000下内部COM插件的编程实现翻译:徐景周 下载示例源码(http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=596)...
  • jz_x
  • jz_x
  • 2003年02月08日 12:02
  • 1592

Word2000/XP中内部COM插件的编程实现

Word2000/XP中内部COM插件的编程实现编译:徐景周 下载示例源码(http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=734...
  • jz_x
  • jz_x
  • 2003年04月19日 09:44
  • 1576

access 2000 转换为97

参考这篇文章   http://65.54.166.79/kb/241709/zh-cn 当转换是出现 无效的字段数据类型   参考这篇文章:http://support.microsoft.com/...
  • tianxiaaoyou
  • tianxiaaoyou
  • 2011年06月30日 14:12
  • 405

几种常见内部排序算法分析与实现(C语言描述)

>                 Tags: alg,c,blog,book,linux 1. 插入排序 1.1 算法思想 插入排序算法的主要思想是: 1)  把要排序的序...
  • tge7618291
  • tge7618291
  • 2012年05月21日 15:13
  • 5040

【outlook plugin】Office2000下内部COM插件的编程实现 译者:徐景周

下载示例源代码 简介 你也许曾在Office2000下的Word2000、Access2000、Excel2000、PowerPoint2000等软件中的工具条或菜单条资源中,看到一些其它软件...
  • pirate97
  • pirate97
  • 2012年03月22日 11:04
  • 3031

Linux命令:cat命令详解

cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。...
  • a1232345
  • a1232345
  • 2014年07月23日 21:06
  • 570

wps插件开发中com组件权限

需要对wps写一个小的插件,也就是几行代码的事情,但却碰到了一个坑 wps中的com组件的调用和MSoffice非常的相似,几乎只需要把包的头修改一下就可以用了。 比如开发wps文档的插件...
  • guochunyang
  • guochunyang
  • 2017年11月13日 15:34
  • 206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Access2000下内部COM插件的编程实现
举报原因:
原因补充:

(最多只允许输入30个字)