VC6编写Office插件.docx

上传人:b****6 文档编号:8601252 上传时间:2023-02-01 格式:DOCX 页数:51 大小:409.81KB
下载 相关 举报
VC6编写Office插件.docx_第1页
第1页 / 共51页
VC6编写Office插件.docx_第2页
第2页 / 共51页
VC6编写Office插件.docx_第3页
第3页 / 共51页
VC6编写Office插件.docx_第4页
第4页 / 共51页
VC6编写Office插件.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

VC6编写Office插件.docx

《VC6编写Office插件.docx》由会员分享,可在线阅读,更多相关《VC6编写Office插件.docx(51页珍藏版)》请在冰豆网上搜索。

VC6编写Office插件.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1