频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源: 作者: 出处:巧巧读书 2007-10-09 进入讨论组
下一页 1 2 

源码下载

  简介

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

图 文 结 合:http://www.qqread.com/winnt/n353909.html 更多文章 更多内容请看AccessJava编程开发手册软件插件专题,或进入讨论组讨论。
下一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章