VC6编写Office插件Word文档格式.docx
《VC6编写Office插件Word文档格式.docx》由会员分享,可在线阅读,更多相关《VC6编写Office插件Word文档格式.docx(51页珍藏版)》请在冰豆网上搜索。
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
\ProgramFiles\MicrosoftOffice\OFFICE11
然后在stdafx.h中加入如下语句:
#import"
\\ProgramFiles\\CommonFiles\\MicrosoftShared\\OFFICE11\\mso.dll"
\
rename_namespace("
Office"
)named_guids,exclude("
Pages"
)
usingnamespaceOffice;
\\ProgramFiles\\CommonFiles\\MicrosoftShared\\VBA\\VBA6\\VBE6EXT.olb"
VBE6"
usingnamespaceVBE6;
\\ProgramFiles\\MicrosoftOffice\\OFFICE11\\MSWORD.OLB"
rename("
ExitWindows"
"
ExitWindowsEx"
Word"
),raw_interfaces_only,named_guids,exclude("
usingnamespaceWord;
加完以上代码以后一定要编译一下,看看是否能够成功。
引入这两个文件的原因,主要是为了引入一些变量类型,为后面的创建UI作准备。
最后一步,编写代码。
在OnConnection加入如下代码:
CComPtr<
Office:
:
_CommandBars>
spCmdBars;
CComQIPtr<
Word:
_Application>
spApp(Application);
ATLASSERT(spApp);
HRESULThr=spApp->
get_CommandBars(&
spCmdBars);
if(FAILED(hr))
returnhr;
ATLASSERT(spCmdBars);
CComVariantvName("
MyAddin"
);
Office:
CommandBar>
spNewCmdBar;
CComVariantvPos
(1);
CComVariantvTemp(VARIANT_TRUE);
CComVariantvEmpty(DISP_E_PARAMNOTFOUND,VT_ERROR);
spNewCmdBar=spCmdBars->
Add(vName,vPos,vEmpty,vTemp);
CommandBarControls>
spBarControls;
spBarControls=spNewCmdBar->
GetControls();
ATLASSERT(spBarControls);
CComVariantvToolBarType
(1);
CComVariantvShow(VARIANT_TRUE);
CommandBarControl>
spNewBar;
spNewBar=spBarControls->
Add(vToolBarType,vEmpty,vEmpty,vEmpty,vShow);
ATLASSERT(spNewBar);
_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))
PutVisible(VARIANT_TRUE);
PutCaption(OLESTR("
myAddin"
));
PutEnabled(VARIANT_TRUE);
PutTooltipText(OLESTR("
test1"
PutTag(OLESTR("
spNewCmdBar->
m_spCmdButton=spCmdButton;
这样,再次打开word,就可以看到如图一所示的界面效果了。
图9
但是点击时没有响应,最后就让我们来解决这个问题。
1.在COutlookAddin继承类中加入IDispEventSimpleImpl继承,代码如下:
classATL_NO_VTABLECOutlookAddin:
publicCComObjectRootEx<
CComSingleThreadModel>
……
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:
0x01,OnClickButton2,&
SINK_ENTRY_INFO(3,__uuidof(Office:
0x01,OnClickMenu,&
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接口函数的最后部分,加入下面代码来打开连接:
CommandButton1Events:
DispEventAdvise((IDispatch*)m_spButton);
在OnDisconnection接口函数中,加入下面代码来断开连接:
DispEventUnadvise((IDispatch*)m_spButton);
综上所述,编写一个简单的office的插件,其实并不难,只要按照步骤一步一步进行,肯定能成功,如果大家在使用过程中有什么疑问,欢迎一起探讨。
相关链接:
Office2000下内部COM插件的编程实现
最新评论[发表评论][文章投稿]
查看所有评论
推荐给好友
打印
哈哈,终于发现了。
用那个title一样的dll就可以。
我靠一下!
(pjl110发表于2007-11-1317:
16:
00)
我没有MSADDNDR.TLB文件,谁发一下给我啊!
谢谢!
pjllovelihua@(pjl110发表于2007-11-1316:
53:
请问下,怎么将VC6.0与Delphi联系起来编程,我是想写一个程序,用Delphi做前台的按钮控制,而当点击了按钮时能通过Delphi连接到VC上,用VC做后台控制,请问该怎么做啊?
?
!
(dreamf发表于2007-9-2415:
04:
你好,我是按你的操作进行的,怎么编译StdAfx.h中加入如下语句:
#import
"
\\Program
Files\\Common
Files\\Microsoft
Shared\\OFFICE11\\mso.dll"
\
rename_namespace("
)
named_guids,exclude("
using
namespace
Office;
Shared\\VBA\\VBA6\\VBE6EXT.olb"
VBE6;
Office\\OFFICE11\\MSWORD.OLB"
rename("
),
raw_interfaces_only,
named_guids
exclude("
Word;
后,就出现了错误,说“cannot
compile
the
file
D:
\TestAddin\StdAfx.h'
no
tool
is
associated
with
extension
”
可以帮我解决这个问题吗?
(dreamf发表于2007-9-2414:
57:
56:
您好!
我想开发一个QQ的插件,不知道按你这个方法可不可以实现?
(linewei发表于2007-4-92:
我最近在写一个excel插件,道理跟上面的差不多,但是我遇到了一些困难,我想捕获鼠标消息,比如鼠标点击了一个单元格,那么单元格的数据立刻会被显示到另外的一个控件中,怎么才能对office中的鼠标消息编写响应函数。
上面的例子捕获的是WM_COMMAND消息(eyesmart发表于2007-4-617:
02:
vc
vb
dll
控件学习网(
源码 )
(konny发表于2007-3-515:
58:
一个菜鸟问题:
请问ATL这些编程方法在哪里可以找到,比如我们怎么就知道要去实现某一个接口的?
(w_xbei发表于2007-2-2714:
17:
使用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文件,