VC6编写Office插件Word文档格式.docx

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

VC6编写Office插件Word文档格式.docx

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

VC6编写Office插件Word文档格式.docx

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

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

当前位置:首页 > 解决方案 > 其它

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

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