自己ATL做的word转化为pdf格式插件如何继承媸录

ATL做的word插件中怎样响应word事件,谁做过类似的东西啊
[问题点数:20分,结帖人liuguangzhaovip]
本版专家分:100
结帖率 91.67%
CSDN今日推荐
本版专家分:21431
本版专家分:100
本版专家分:2545
本版专家分:100
本版专家分:2545
本版专家分:5
匿名用户不能发表回复!|
其他相关推荐
答题卡制作word插件
word插件,图片处理专用
试过就知道,很有用的
java导出word的插件 先制订好word模板 再导出就可以了
MFC ATL编写的 word菜单插件
简单的实现了 在word菜单上弹出对话框
获取word文档所有段落,获取word所有内容,区分目录结构和正文结构
在DocumentOpen中执行,
//当前段落级别(1~10 其中10为正文)
int currentoutlineLevel = -1;
//文档总段落数
int paragCount = 0;
//段落内容
_bstr_t paragraphT
Aspose.Words
基于VC++ ATL实现电子印章的基本功能,主要是电子印章控件的实现,作为初学者参考。
Word Events
在Word中只有Application object和Document object响应事件:
Events With Application object :
NewDocument,
DocumentOpen,
DocumentBeforeClose,
DocumentBeforePrint,
DocumentBeforeSave Wind
利用这个插件实现用word记谱。
简谱记录的实用软件
1. 连接点为出接口([out]属性),当控件执行到某个时刻,需要通知控件外部对象, 可用到连接点, 作用有点类似回调函数.如嵌入到网页里的插件, 需要通知网页某些信息时, 可采用连接点事件, 网页端则用javacript或vbscript来响应. 当ATL中有连接点事件, 名为CPEvent, 网页部分如下定义即可响应:SUB AtlComId_CPEvent天极传媒:天极网全国分站
您现在的位置: >>使用VC++ ATL实现Office的COM插件
使用VC++ ATL实现Office的COM插件
  本文介绍了一种使用VC++ ATL(Active Template Library),利用IDTExtensibility2接口,为 Word加入功能简单的COM插件(addin),加入工具栏按钮和菜单等可视部件,并为其加入响应事件的方法,并在最后简单说明了实现与Office宏混合编程的方法。  说到Office相关的编程,大家首先想到的可能是VBA( for Application),事实上, ATL也是一种很好的工具。这里介绍的就是一种基于ATL的Office编程方法,实现的功能很简单,仅仅是一个示例,步骤如下:  1、在编程环境下,利用向导生成一个名为WordAddin的ATL COM Appwizard工程:  在向导的第一个对话框中server type单选框选择默认的类型Dynamic Link Library(DLL),下面的三个复选框中选择Allow merging of proxy-stub code选项。然后单击Finish,这样一个空的ATL project就产生了(如图 一)。
图一  2、插入我们的ATL object:   选择菜单Insert―>Insert new ATL object,出现new ATL object向导对话框,左边的category列表中选择object,右边相应的选择simple object,单击下一步(Next)(如图 二):
图二  在第二个对话框names属性页的“Short Name:”中填入Addin(如图三):
图三  在Attribute属性页中,选中Support IsupportErrorInfo复选框,单击OK(如图四):
图四  这样就产生了一个类名为WordAddin的ATL COM object,编译(build)该工程看是否一切正常。   2、用IDTExtensibility2实现CAddin类:    IDTExtensibility2是定义在MSADDin Designer typelibrary(MSADDNDR.dll/MSADDNDR.tlb)中的库,该文件一般在C:\Program Files/Common Files/Designer目录下。IDTExtensibility2 库提供了 5 个可用来操纵插件以及宿主应用程序的事件: OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete 和 OnBeginShutdown。这些事件的具体功能和用法可查阅MSDN。用向导来实现IDTExtensibility2接口:切换到classview页,右键点击Caddin类,在弹出的菜单中选择Implement Interface,出现Implement Interface对话框,选择Add Tylpelib按钮(如图 五):
图五  (单击OK,)在出现的Browse Typelibraries对话框中选择Microsoft Add-in Designer(1.0) (如图六):
图六  单击OK,在AddinDesignerObjects属性页中选择IDTExtensibility2(如图七):
图七  再单击OK。这样向导就在ATL COM object中添加了IDTExtensibility2的5个具体事件,并对他们进行了一些默认的初始设置,同时还更新了COM_INTERFACE_MAP()。
1(作者:useresu责任编辑:方舟)
天极新媒体&最酷科技资讯扫码赢大奖
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!
笔记本手机数码家电用VC6.0编写Word插件(Office2K、XP、03) - C/C++/VC/MFC...
我的图书馆
用VC6.0编写Word插件(Office2K、XP、03) - C/C++/VC/MFC...
最近因为工作的需要,学习了一下Office的编写方法。在走了不少弯路以后,最后终于把编写插件的原理给搞清楚了,不敢独享,拿出来跟大家共享一下。下面就以 2003为例,向大家简单介绍一下。第一步,利用向导生成一个ATL COM AppWizard的新工程。图1 在向导的第一个对话框中,器类型选择Dynamic Link Library(DLL),然后单击Finish即可。 图2 然后,选取Insert-&New ATL Object项,在弹出的ATL对象向导对话框中选中相应Objects对应右侧的Simple Object选项,点击下一步。 图3 在弹出的对话框中ShortName中输入相应名称,点确定完成插入ATL对象。 图4 这样一个简单的基于ATL的COM工程就建立成功了。 第二步,通过导入类型库来实现_IDTExtensibility2接口。在ClassView中的新加的类上点右键,在弹出的右键菜单中选Implement Interface项。 图5 在弹出的实现接口对话框中点击Add Typelib 图6 在弹出的Browse Type Libraries对话框中,选取 Add-in Designer(1.0)子项,点OK按钮 图7 在弹出的接口列表对话框中选中_IDTExtensibility2接口,点OK按钮完成导入 这样的话,系统将会为你生成空的五个所需接口函数,分别是OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete、OnBeginShutdown。 第三步,通过上面的两个步骤,我们的插件已经形成,但是Office怎么知道启动的时候要来把我们的插件Load起来呢?Office的不同组件,例如Word、Excel、Outlook等怎么知道去Load自己的插件呢?答案就是在注册表中加入相应的键值。打开文件视图FileView—&Resource File中的rgs文件,加入以下代码:HKCU& & {& && &Software& && & {& && &&&Microsoft& && &&&{& && && & Office& && && && & { & && && && &Word& && && && && &{& && && && & Addins& && && && && &{& && && && && &''TestAddin.SimAddin''& && && && && & { & && && && && &&&val FriendlyName = s ''WORD Custom Addin''& && && && && &&&val Description = s ''Word Custom Addin''& && && && && &&&val LoadBehavior = d ''''& && && && && &&&val CommandLineSafe = d ''''& && && && && &&&}& && && && && &}& && && && & }& && && & }& && & }& &}}以上代码由三个需要注意的地方:1. Office下面的那个子项代表了这个插件是属于那个组件,Word、Excel、Outlook等等。2. Addins下面的那个子项要写成你添加的COM组件的名字,千万不要照着我的工程的名字照抄。3. 所有的值两边加的都是单引号,而且要用英文下的单引号,不能用双引号。这样一个Office插件的框架才算完成,你可以在OnConnection函数中加一些测试代码,看看有没有执行到,如果执行成功才能继续,否则检查上面的步骤有没有错误。 第四步,同时需要import两个office的文件,一个是MSO.dll,另一个是MSWORD.OLB。这两个文件可以在以下位置找到(具体位置与office安装路径有关):C:\Program Files\Common Files\Microsoft Shared\OFFICE11C:\Program Files\Microsoft Office\OFFICE11然后在stdafx.h中加入如下语句: #import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll" & && &&&\& && &&&rename_namespace("Office") named_guids,exclude("ages")using namespace O#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("ages")using namespace W加完以上代码以后一定要编译一下,看看是否能够成功。引入这两个文件的原因,主要是为了引入一些变量类型,为后面的创建UI作准备。最后一步,编写代码。在OnConnection加入如下代码:& && &CComPtr & Office::_CommandBars& spCmdB & && &CComQIPtr &Word::_Application& spApp(Application); & && &ATLASSERT(spApp);& && &HRESULT hr = spApp-&get_CommandBars(&spCmdBars);& && &if(FAILED(hr))& && && && &ATLASSERT(spCmdBars);& && &CComVariant vName("MyAddin");& && &CComPtr &Office::CommandBar& spNewCmdB& && &CComVariant vPos(1); & && &CComVariant vTemp(VARIANT_TRUE); & && &CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR); & && &spNewCmdBar = spCmdBars-&Add(vName, vPos, vEmpty, vTemp);& && & & && &CComPtr & Office::CommandBarControls& spBarC& && &spBarControls = spNewCmdBar-&GetControls();& && &ATLASSERT(spBarControls);& && & & && &CComVariant vToolBarType(1);& && &CComVariant vShow(VARIANT_TRUE);& && &CComPtr & Office::CommandBarControl& spNewB & && &spNewBar = spBarControls-&Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow); & && &ATLASSERT(spNewBar);& && &&&& && &CComQIPtr & Office::_CommandBarButton& spCmdButton(spNewBar);& && &ATLASSERT(spCmdButton);& && &&&& && &HBITMAP hBmp =(HBITMAP):oadImage(_Module.GetResourceInstance(),& && &MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);& && &&&& && &::OpenClipboard(NULL);& && &::EmptyClipboard();& && &::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);& && &::CloseClipboard();& && &:eleteObject(hBmp); & && &&&& && &spCmdButton-&utStyle(Office::msoButtonIconAndCaption);& && &hr = spCmdButton-&PasteFace();& && &if (FAILED(hr))& && && && &&&& && &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 = spCmdB这样,再次打开word,就可以看到如图一所示的界面效果了。图9但是点击时没有响应,最后就让我们来这个问题。1. 在COutlookAddin继承类中加入IDispEventSimpleImpl继承,代码如下: class ATL_NO_VTABLE COutlookAddin : & && &&&public CComObjectRootEx&CComSingleThreadModel&,& && &&&……& && &&&public IDispEventSimpleImpl&1,COutlookAddin,&__uuidof(Office::_CommandBarButtonEvents)&& && &&&2. 声明_ATL_SINK_INFO结构回调参数信息。在OutlookAddin.h文件中加入下面语句: // 按钮事件响应信息声明extern _ATL_FUNC_INFO OnClickButtonI在OutlookAddin.cpp文件中加入语句,如下: // 按钮事件响应信息定义_ATL_FUNC_INFO OnClickButtonInfo ={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 __stdcall OnClickButton1(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault);在OutlookAddin.cpp中加入实现: // 条按钮1点击事件响应函数void __stdcall CWordAddin::OnClickButton1(IDispatch * & & & & /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault){& & & & & & & & MessageBox(NULL, "hello", "world", MB_OK);}5. 最后,打开或断开与接口的连接。方法如下在OnConnection接口函数的最后部分,加入下面代码来打开连接: 在OnConnection接口函数的最后部分,加入下面代码来打开连接: CommandButton1Events:ispEventAdvise((IDispatch*)m_spButton);在OnDisconnection接口函数中,加入下面代码来断开连接: CommandButton1Events:ispEventUnadvise((IDispatch*)m_spButton);综上所述,编写一个简单的office的插件,其实并不难,只要按照步骤一步一步进行,肯定能成功,如果大家在使用过程中有什么疑问,欢迎一起探讨。
天地茫茫不知所止&&日月循环周而复始
仔细研究一下C++代码就可以了解如何编写Office 2000插件。  Office 2000插件其实就是一个实现了IDTExtensibility2接口的自动化对象。IDTExtensibility2 接口相当简单,插件需要实现接口定义的全部5个函数:  OnConnection:当应用程序连接到插件时会调用这个函数。插件在函数中接收下列初始化信息——应用程序对象模型进入点的指针,连接模式(是手工加入还是通过命令行载入), 应用程序的对象模型指针和用户自定义的信息。  OnDisconnection:当应用程序断开插件时被调用,插件应该在这里清除先前分配的资源,删除它添加到应用程序的界面元素。  OnStartupComplete:这个函数是当应用程序自动启动插件时被调用的。调用时,其他的插件都已经被加载到了内存,这时可以同其他插件进行通信。这个函数还适合添加用户界面元素。  OnBeginShutdown:当应用程序准备关闭并将要断开插件时会被调用,这时插件应该停止接收用户输入。  OnAddInsUpdate:当注册的插件列表被改变后会被调用。如果我们的插件不依赖于其他插件,这个函数可以为空。
[转]&[转]&[转]&
喜欢该文的人也喜欢使用VC++ ATL实现Office的COM插件
本文介绍了一种使用VC++ ATL(Active Template Library),利用IDTExtensibility2接口,为Microsoft Word加入功能简单的COM插件(addin),加入工具栏按钮和菜单等可视部件,并为其加入响应事件的方法,并在最后简单说明了实现与Office宏混合的方法。  说到Office相关的编程,大家首先想到的可能是VBA(Visual Basic for Application),事实上, ATL也是一种很好的工具。这里介绍的就是一种基于ATL的Office编程方法,实现的功能很简单,仅仅是一个示例,步骤如下:  1、在visual C++编程环境下,利用向导生成一个名为WordAddin的ATL COM Appwizard工程:  在向导的第一个对话框中server type单选框选择默认的服务器类型Dynamic Link Library(DLL),下面的三个复选框中选择Allow merging of proxy-stub code选项。然后单击Finish,这样一个空的ATL project就产生了(如图 一)。
图一  2、插入我们的ATL object:   选择菜单Insert—>Insert new ATL object,出现new ATL object向导对话框,左边的category列表中选择object,右边相应的选择simple object,单击下一步(Next)(如图 二):
图二  在第二个对话框names属性页的“Short Name:”中填入Addin(如图三):
图三  在Attribute属性页中,选中Support IsupportErrorInfo复选框,单击OK(如图四):
图四  这样就产生了一个类名为WordAddin的ATL COM object,编译(build)该工程看是否一切正常。   2、用IDTExtensibility2实现CAddin类:    IDTExtensibility2是定义在MSADDin Designer typelibrary(MSADDNDR.dll/MSADDNDR.tlb)中的库文件,该文件一般在C:Program Files/Common Files/Designer目录下。IDTExtensibility2 库提供了 5 个可用来操纵插件以及宿主应用程序的事件: OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete 和 OnBeginShutdown。这些事件的具体功能和用法可查阅MSDN。用向导来实现IDTExtensibility2接口:切换到classview页,右键点击Caddin类,在弹出的菜单中选择Implement Interface,出现Implement Interface对话框,选择Add Tylpelib按钮(如图 五):
图五  (单击OK,)在出现的Browse Typelibraries对话框中选择Microsoft Add-in Designer(1.0) (如图六):
图六  单击OK,在AddinDesignerObjects属性页中选择IDTExtensibility2(如图七):
图七  再单击OK。这样向导就在ATL COM object中添加了IDTExtensibility2的5个具体事件,并对他们进行了一些默认的初始设置,同时还更新了COM_INTERFACE_MAP()。 4、注册插件到它的宿主程序:   打开文件视图FileView—>Resource File中的Addin.rgs文件,加入以下代码:
HKCU{ Software {  Microsoft  {   Office   {    Word    {     Addins     {      WordAddin.Addin      {       val FriendlyName = s WORD Custom Addin       val Description = s Word Custom Addin       val LoadBehavior = d        val CommandLineSafe = d       }     }    }   }  } }}  5、重新编译(build)该工程注册我们的插件。   6、运行,选择Executable File为word 2000,注意要选择正确的路径,如果运行成功,则插件已经加入到word中。   7、给插件添加菜单和按钮:   这里简单的介绍一下Office 的命令条:在Office中,菜单栏、工具栏和弹出式菜单都叫做命令条(Command Bar对象)。所有这些种类的命令条中都可以包括其他命令条和不限数量的控件,如相对工具栏这个命令条而言,按钮就是它的控件。有的控件(如菜单)本身又是命令条,可以多级嵌套。所有的命令条可用一个CommandBars集合控制。CommandBars集合是一个通用的可共享且可编程的对象,通过它的Add()方法可以为其添加一个CommandBar 对象(即命令条),而每个 CommandBar 对象都有一个CommandBarControls 集合,这个集合里包含了这个命令条里的所有控件。使用 CommandBar 对象的 Controls 属性可引用命令条中的控件。   现在给word加入一个工具条及其按钮和一个菜单:   首先在工程中加入office和Word的类型库,在stdafx.h文件中加入以下代码:
#import "C:Program FilesMicrosoft OfficeOfficemso9.dll" rename_namespace("Office") named_guids using namespace O#import "C:Program FilesMicrosoft OfficeOfficeMSOUTL9.olb" rename_namespace("Word"), raw_interfaces_only, named_guids using namespace O  注意:一定要把路径改为和office的安装路径一致。   在Word对象模型中,Application对象是代表整个工程的最高级对象,我们可以用它的GetCommandBars方法得到CommandBars对象,由于CommandBars对象是Word所有工具条和菜单项的集合,所以就可以通过调用它的Add方法添加新的工具条。然后为工具条添加新的按钮,其实方法一样简单,我们可以调用CommandBar的GetControls方法得到工具条的CommandBarControls集合,如前所说,CommandBarControls集合是该工具条所有控件的集合,按钮自然是其中之一,那么接下来我们就可以通过调用CommandBarControls集合的Add方法添加一个新的按钮了。下面是具体的实现代码:
CComQIPtr<_Application> spApp(Application);ATLASSERT(spApp);m_spApp = spAHRESULT hr = AppEvents::DispEventAdvise(m_spApp);if(FAILED(hr)) CComPtr <Office::_CommandBars> spCmdB CComPtr <Office::CommandBar> spCmdBhr = m_spApp->get_CommandBars(&spCmdBars);if(FAILED(hr)) ATLASSERT(spCmdBars);// now we add a new toolband to Word// to which well add 2 buttonsCComVariant vName("WordAddin");CComPtr spNewCmdB// position it below all toolbands//MsoBarPosition::msoBarTop = 1CComVariant vPos(1); CComVariant vTemp(VARIANT_TRUE); // menu is temporary CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR); //Add a new toolband through Add method// vMenuTemp holds an unspecified parameter//spNewCmdBar points to the newly created toolbandspNewCmdBar = spCmdBars->Add(vName, vPos, vEmpty, vTemp);//now get the toolbands CommandBarControlsCComPtr < Office::CommandBarControls> spBarCspBarControls = spNewCmdBar->GetControls();ATLASSERT(spBarControls);//MsoControlType::msoControlButton = 1CComVariant vToolBarType(基于ATL的Office电子签章COM控件的实现_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于ATL的Office电子签章COM控件的实现
&&电子签章开发资料
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 word文档转换成pdf文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信