VC6编写Office插件.docx
- 文档编号:8601252
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:51
- 大小:409.81KB
VC6编写Office插件.docx
《VC6编写Office插件.docx》由会员分享,可在线阅读,更多相关《VC6编写Office插件.docx(51页珍藏版)》请在冰豆网上搜索。
VC6编写Office插件
用VC6.0编写Word插件(Office2K、XP、03)
作者:
hjphy
源代码下载
最近因为工作的需要,学习了一下Office插件的编写方法。
在走了不少弯路以后,最后终于把编写插件的原理给搞清楚了,不敢独享,拿出来跟大家共享一下。
下面就以Word2003为例,向大家简单介绍一下。
第一步,利用向导生成一个ATLCOMAppWizard的新工程。
图1
在向导的第一个对话框中,服务器类型选择DynamicLinkLibrary(DLL),然后单击Finish即可。
图2
然后,选取菜单Insert->NewATLObject项,在弹出的ATL对象向导对话框中选中相应Objects对应右侧的SimpleObject选项,点击下一步。
图3
在弹出的对话框中ShortName中输入相应名称,点确定完成插入ATL对象。
图4
这样一个简单的基于ATL的COM组件工程就建立成功了。
第二步,通过导入类型库来实现_IDTExtensibility2接口。
在ClassView中的新加的类上点鼠标右键,在弹出的右键菜单中选ImplementInterface项。
图5
在弹出的实现接口对话框中点击AddTypelib
图6
在弹出的BrowseTypeLibraries对话框中,选取MicrosoftAdd-inDesigner(1.0)子项,点OK按钮
图7
在弹出的接口列表对话框中选中_IDTExtensibility2接口,点OK按钮完成导入
这样的话,系统将会自动为你生成空的五个所需接口函数,分别是OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete、OnBeginShutdown。
第三步,通过上面的两个步骤,我们的插件框架已经形成,但是Office怎么知道启动的时候要来把我们的插件Load起来呢?
Office的不同组件,例如Word、Excel、Outlook等怎么知道去Load自己的插件呢?
答案就是在注册表中加入相应的键值。
打开文件视图FileView—>ResourceFile中的rgs文件,加入以下代码:
HKCU
{
Software
{
Microsoft
{
Office
{
Word
{
Addins
{
''TestAddin.SimAddin''
{
valFriendlyName=s''WORDCustomAddin''
valDescription=s''WordCustomAddin''
valLoadBehavior=d''00000003''
valCommandLineSafe=d''00000001''
}
}
}
}
}
}
}
以上代码由三个需要注意的地方:
1.Office下面的那个子项代表了这个插件是属于那个组件,Word、Excel、Outlook等等。
2.Addins下面的那个子项要写成你添加的COM组件的名字,千万不要照着我的工程的名字照抄。
3.所有的值两边加的都是单引号,而且要用英文下的单引号,不能用双引号。
这样一个Office插件的框架才算完成,你可以在OnConnection函数中加一些测试代码,看看有没有执行到,如果执行成功才能继续,否则检查上面的步骤有没有错误。
第四步,同时需要import两个office的文件,一个是MSO.dll,另一个是MSWORD.OLB。
这两个文件可以在以下位置找到(具体位置与office安装路径有关):
C:
\ProgramFiles\CommonFiles\MicrosoftShared\OFFICE11
C:
\ProgramFiles\MicrosoftOffice\OFFICE11
然后在stdafx.h中加入如下语句:
#import"C:
\\ProgramFiles\\CommonFiles\\MicrosoftShared\\OFFICE11\\mso.dll"
\
rename_namespace("Office")named_guids,exclude("Pages")
usingnamespaceOffice;
#import"C:
\\ProgramFiles\\CommonFiles\\MicrosoftShared\\VBA\\VBA6\\VBE6EXT.olb"rename_namespace("VBE6")
usingnamespaceVBE6;
#import"C:
\\ProgramFiles\\MicrosoftOffice\\OFFICE11\\MSWORD.OLB"rename("ExitWindows","ExitWindowsEx")
#import"C:
\\ProgramFiles\\MicrosoftOffice\\OFFICE11\\MSWORD.OLB"
\
rename_namespace("Word"),raw_interfaces_only,named_guids,exclude("Pages")
usingnamespaceWord;
加完以上代码以后一定要编译一下,看看是否能够成功。
引入这两个文件的原因,主要是为了引入一些变量类型,为后面的创建UI作准备。
最后一步,编写代码。
在OnConnection加入如下代码:
CComPtr : _CommandBars>spCmdBars; CComQIPtr : _Application>spApp(Application); ATLASSERT(spApp); HRESULThr=spApp->get_CommandBars(&spCmdBars); if(FAILED(hr)) returnhr; ATLASSERT(spCmdBars); CComVariantvName("MyAddin"); CComPtr : CommandBar>spNewCmdBar; CComVariantvPos (1); CComVariantvTemp(VARIANT_TRUE); CComVariantvEmpty(DISP_E_PARAMNOTFOUND,VT_ERROR); spNewCmdBar=spCmdBars->Add(vName,vPos,vEmpty,vTemp); CComPtr : CommandBarControls>spBarControls; spBarControls=spNewCmdBar->GetControls(); ATLASSERT(spBarControls); CComVariantvToolBarType (1); CComVariantvShow(VARIANT_TRUE); CComPtr : CommandBarControl>spNewBar; spNewBar=spBarControls->Add(vToolBarType,vEmpty,vEmpty,vEmpty,vShow); ATLASSERT(spNewBar); CComQIPtr : _CommandBarButton>spCmdButton(spNewBar); ATLASSERT(spCmdButton); HBITMAPhBmp=(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)) returnhr; spCmdButton->PutVisible(VARIANT_TRUE); spCmdButton->PutCaption(OLESTR("myAddin")); spCmdButton->PutEnabled(VARIANT_TRUE); spCmdButton->PutTooltipText(OLESTR("test1")); spCmdButton->PutTag(OLESTR("test1")); spNewCmdBar->PutVisible(VARIANT_TRUE); m_spCmdButton=spCmdButton; 这样,再次打开word,就可以看到如图一所示的界面效果了。 图9 但是点击时没有响应,最后就让我们来解决这个问题。 1.在COutlookAddin继承类中加入IDispEventSimpleImpl继承,代码如下: classATL_NO_VTABLECOutlookAddin: publicCComObjectRootEx …… publicIDispEventSimpleImpl<1,COutlookAddin,&__uuidof(Office: : _CommandBarButtonEvents)> 2.声明_ATL_SINK_INFO结构回调参数信息。 在OutlookAddin.h文件中加入下面语句: //按钮事件响应信息声明 extern_ATL_FUNC_INFOOnClickButtonInfo; 在OutlookAddin.cpp文件中加入定义语句,如下: //按钮事件响应信息定义 _ATL_FUNC_INFOOnClickButtonInfo={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF |VT_BOOL}}; 3.加入Sink映射,如下: EGIN_SINK_MAP(COutlookAddin) SINK_ENTRY_INFO(1,__uuidof(Office: : _CommandBarButtonEvents),/*dispid*/ 0x01,OnClickButton1,&OnClickButtonInfo) SINK_ENTRY_INFO(2,__uuidof(Office: : _CommandBarButtonEvents),/*dispid*/ 0x01,OnClickButton2,&OnClickButtonInfo) SINK_ENTRY_INFO(3,__uuidof(Office: : _CommandBarButtonEvents),/*dispid*/ 0x01,OnClickMenu,&OnClickButtonInfo) END_SINK_MAP() 4.加入事件函数。 在OutlookAddin.h中加入声明: void__stdcallOnClickButton1(IDispatch*/*Office: : _CommandBarButton**/ Ctrl,VARIANT_BOOL*CancelDefault); 在OutlookAddin.cpp中加入实现: //工具条按钮1点击事件响应函数 void__stdcallCWordAddin: : OnClickButton1(IDispatch* /*Office: : _CommandBarButton**/Ctrl,VARIANT_BOOL*CancelDefault) { MessageBox(NULL,"hello","world",MB_OK); } 5.最后,打开或断开与接口的连接。 方法如下 在OnConnection接口函数的最后部分,加入下面代码来打开连接: 在OnConnection接口函数的最后部分,加入下面代码来打开连接: CommandButton1Events: : DispEventAdvise((IDispatch*)m_spButton); 在OnDisconnection接口函数中,加入下面代码来断开连接: CommandButton1Events: : DispEventUnadvise((IDispatch*)m_spButton); 综上所述,编写一个简单的office的插件,其实并不难,只要按照步骤一步一步进行,肯定能成功,如果大家在使用过程中有什么疑问,欢迎一起探讨。 相关链接: Office2000下内部COM插件的编程实现 最新评论[发表评论][文章投稿] 查看所有评论 推荐给好友 打印 哈哈,终于发现了。 用那个title一样的dll就可以。 我靠一下! (pjl110发表于2007-11-1317: 16: 00) 我没有MSADDNDR.TLB文件,谁发一下给我啊! 谢谢! pjllovelihua@(pjl110发表于2007-11-1316: 53: 00) 请问下,怎么将VC6.0与Delphi联系起来编程,我是想写一个程序,用Delphi做前台的按钮控制,而当点击了按钮时能通过Delphi连接到VC上,用VC做后台控制,请问该怎么做啊? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 谢谢! ! (dreamf发表于2007-9-2415: 04: 00) 你好,我是按你的操作进行的,怎么编译StdAfx.h中加入如下语句: #import "C: \\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll" \ rename_namespace("Office") named_guids,exclude("Pages") using namespace Office; #import "C: \\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6") using namespace VBE6; #import "C: \\Program Files\\Microsoft Office\\OFFICE11\\MSWORD.OLB" rename("ExitWindows","ExitWindowsEx") #import "C: \\Program Files\\Microsoft Office\\OFFICE11\\MSWORD.OLB" \ rename_namespace("Word"), raw_interfaces_only, named_guids ,exclude("Pages") using namespace Word; 后,就出现了错误,说“cannot compile the file 'D: \TestAddin\StdAfx.h': no compile tool is associated with the file extension ” 可以帮我解决这个问题吗? ? 谢谢! ! ! ! ! ! ! ! ! ! (dreamf发表于2007-9-2414: 57: 00) 你好,我是按你的操作进行的,怎么编译StdAfx.h中加入如下语句: #import "C: \\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll" \ rename_namespace("Office") named_guids,exclude("Pages") using namespace Office; #import "C: \\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6") using namespace VBE6; #import "C: \\Program Files\\Microsoft Office\\OFFICE11\\MSWORD.OLB" rename("ExitWindows","ExitWindowsEx") #import "C: \\Program Files\\Microsoft Office\\OFFICE11\\MSWORD.OLB" \ rename_namespace("Word"), raw_interfaces_only, named_guids ,exclude("Pages") using namespace Word; 后,就出现了错误,说“cannot compile the file 'D: \TestAddin\StdAfx.h': no compile tool is associated with the file extension ” 可以帮我解决这个问题吗? ? 谢谢! ! ! ! ! ! ! ! ! ! (dreamf发表于2007-9-2414: 56: 00) 您好! 我想开发一个QQ的插件,不知道按你这个方法可不可以实现? (linewei发表于2007-4-92: 57: 00) 我最近在写一个excel插件,道理跟上面的差不多,但是我遇到了一些困难,我想捕获鼠标消息,比如鼠标点击了一个单元格,那么单元格的数据立刻会被显示到另外的一个控件中,怎么才能对office中的鼠标消息编写响应函数。 上面的例子捕获的是WM_COMMAND消息(eyesmart发表于2007-4-617: 02: 00) vc vb dll 控件学习网( 源码 ) vc vb dll 控件学习网( 源码 ) (konny发表于2007-3-515: 58: 00) 一个菜鸟问题: 请问ATL这些编程方法在哪里可以找到,比如我们怎么就知道要去实现某一个接口的? (w_xbei发表于2007-2-2714: 17: 00) 使用VC++ATL实现Office的COM插件 作者: useresu 下载源代码 摘要 本文介绍了一种使用VC++ATL(ActiveTemplateLibrary),利用IDTExtensibility2接口,为MicrosoftWord加入功能简单的COM插件(addin),加入工具栏按钮和菜单等可视部件,并为其加入响应事件的方法,并在最后简单说明了实现与Office宏混合编程的方法。 说到Office相关的编程,大家首先想到的可能是VBA(VisualBasicforApplication),事实上,ATL也是一种很好的工具。 这里介绍的就是一种基于ATL的Office编程方法,实现的功能很简单,仅仅是一个示例,步骤如下: 1、在visualC++编程环境下,利用向导生成一个名为WordAddin的ATLCOMAppwizard工程: 在向导的第一个对话框中servertype单选框选择默认的服务器类型DynamicLinkLibrary(DLL),下面的三个复选框中选择Allowmergingofproxy-stubcode选项。 然后单击Finish,这样一个空的ATLproject就产生了(如图一)。 图一 2、插入我们的ATLobject: 选择菜单Insert—>InsertnewATLobject,出现newATLobject向导对话框,左边的category列表中选择object,右边相应的选择simpleobject,单击下一步(Next)(如图二): 图二 在第二个对话框names属性页的“ShortName: ”中填入Addin(如图三): 图三 在Attribute属性页中,选中SupportIsupportErrorInfo复选框,单击OK(如图四): 图四 这样就产生了一个类名为WordAddin的ATLCOMobject,编译(build)该工程看是否一切正常。 2、用IDTExtensibility2实现CAddin类: IDTExtensibility2是定义在MSADDinDesignertypelibrary(MSADDNDR.dll/MSADDNDR.tlb)中的库文件,该文件一般在C: \ProgramFiles/CommonFiles/Designer目录下。 IDTExtensibility2库提供了5个可用来操纵插件以及宿主应用程序的事件: OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete和OnBeginShutdown。 这些事件的具体功能和用法可查阅MSDN。 用向导来实现IDTExtensibility2接口: 切换到classview页,右键点击Caddin类,在弹出的菜单中选择ImplementInterface,出现ImplementInterface对话框,选择AddTylpelib按钮(如图五): 图五 (单击OK,)在出现的BrowseTypelibraries对话框中选择MicrosoftAdd-inDesigner(1.0)(如图六): 图六 单击OK,在AddinDesignerObjects属性页中选择IDTExtensibility2(如图七): 图七 再单击OK。 这样向导就在ATLCOMobject中添加了IDTExtensibility2的5个具体事件,并对他们进行了一些默认的初始设置,同时还更新了COM_INTERFACE_MAP()。 4、注册插件到它的宿主程序: 打开文件视图FileView—>ResourceFile中的Addin.rgs文件,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC6 编写 Office 插件
