分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

联系方式:

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

邮编:710082

编者EMAIL:jingzhou_xu@163.net

未来工作室(Future Studio)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有