分类: C/C++
2008-03-31 14:53:57
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 spApp(Application);
ATLASSERT(spApp);
// 获取CommandBars接口
HRESULT hr = spApp->get_CommandBars(&spCmdBars);
if(FAILED(hr))
return hr;
ATLASSERT(spCmdBars);
// 新增一个工具条及其上一个位图按钮
CComVariant vName("新增Access2000工具条插件");
CComPtr 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;
}
参考文献:
Office2000下内部COM插件的编程实现 -- 徐景周
Word2000/XP中内部COM插件的编程实现 -- 徐景周
Excel2000/XP和PowerPoint2000/XP下内部COM插件的实现 -- 徐景周
ATL开发指南(第二版) -- Tom Armstrong & Ron Patton
联系方式:
地址:陕西省西安市劳动路2号院六单元
邮编:710082
编者EMAIL:jingzhou_xu@163.net
未来工作室(Future Studio)