:
_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文件,