资源预览内容
第1页 / 共42页
第2页 / 共42页
第3页 / 共42页
第4页 / 共42页
第5页 / 共42页
第6页 / 共42页
第7页 / 共42页
第8页 / 共42页
第9页 / 共42页
第10页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
用 VC6.0编写 Word插件(Office2K、XP、03)作者:hjphy源代码下载 最近因为工作的需要,学习了一下 Office插件的编写方法。在走了不少弯路以后,最后终于把编写插件的原理给搞清楚了,不敢独享,拿出来跟大家共享一下。下面就以 Word 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对话框中,选取 Microsoft Add-in Designer(1.0)子项,点 OK按钮 图 7 在弹出的接口列表对话框中选中_IDTExtensibility2 接口,点 OK按钮完成导入 这样的话,系统将会自动为你生成空的五个所需接口函数,分别是OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete、OnBeginShutdown。 第三步,通过上面的两个步骤,我们的插件框架已经形成,但是 Office怎么知道启动的时候要来把我们的插件 Load起来呢?Office 的不同组件,例如 Word、Excel、Outlook 等怎么知道去 Load自己的插件呢?答案就是在注册表中加入相应的键值。打开文件视图 FileViewResource File中的 rgs文件,加入以下代码:HKCUSoftwareMicrosoftOffice WordAddinsTestAddin.SimAddin val FriendlyName = s WORD Custom Addinval Description = s Word Custom Addinval LoadBehavior = d 00000003val CommandLineSafe = d 00000001 以上代码由三个需要注意的地方:1. Office下面的那个子项代表了这个插件是属于那个组件,Word、Excel、Outlook 等等。2. Addins下面的那个子项要写成你添加的 COM组件的名字,千万不要照着我的工程的名字照抄。3. 所有的值两边加的都是单引号,而且要用英文下的单引号,不能用双引号。这样一个 Office插件的框架才算完成,你可以在 OnConnection函数中加一些测试代码,看看有没有执行到,如果执行成功才能继续,否则检查上面的步骤有没有错误。 第四步,同时需要 import两个 office的文件,一个是 MSO.dll,另一个是 MSWORD.OLB。这两个文件可以在以下位置找到(具体位置与 office安装路径有关):C:Program FilesCommon FilesMicrosoft SharedOFFICE11C:Program FilesMicrosoft OfficeOFFICE11然后在 stdafx.h中加入如下语句: #import C:Program FilesCommon FilesMicrosoft SharedOFFICE11mso.dll rename_namespace(Office) named_guids,exclude(Pages)using namespace Office;#import C:Program FilesCommon FilesMicrosoft SharedVBAVBA6VBE6EXT.olb rename_namespace(VBE6)using namespace VBE6;#import C:Program FilesMicrosoft OfficeOFFICE11MSWORD.OLB rename(ExitWindows,ExitWindowsEx)#import C:Program FilesMicrosoft OfficeOFFICE11MSWORD.OLB rename_namespace(Word), raw_interfaces_only, named_guids ,exclude(Pages)using namespace Word;加完以上代码以后一定要编译一下,看看是否能够成功。引入这两个文件的原因,主要是为了引入一些变量类型,为后面的创建 UI作准备。最后一步,编写代码。在 OnConnection加入如下代码:CComPtr spCmdBars; CComQIPtr spApp(Application); ATLASSERT(spApp);HRESULT hr = spApp-get_CommandBars(if(FAILED(hr)return hr;ATLASSERT(spCmdBars);CComVariant vName(MyAddin);CComPtr spNewCmdBar;CComVariant vPos(1); CComVariant vTemp(VARIANT_TRUE); CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR); spNewCmdBar = spCmdBars-Add(vName, vPos, vEmpty, vTemp);CComPtr spBarControls;spBarControls = spNewCmdBar-GetControls();ATLASSERT(spBarControls);CComVariant vToolBarType(1);CComVariant vShow(VARIANT_TRUE);CComPtr spNewBar; spNewBar = spBarControls-Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow); ATLASSERT(spNewBar);CComQIPtr spCmdButton(spNewBar);ATLASSERT(spCmdButton);HBITMAP hBmp =(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)return 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 = spCmdButton;这样,再次打开 word,就可以看到如图一所示的界面效果了。图 9但是点击时没有响应,最后就让我们来解决这个问题。1. 在 COutlookAddin继承类中加入 IDispEventSimpleImpl继承,代码如下: class ATL_NO_VTABLE COutlookAddin : public CComObjectRootEx,public IDispEventSimpleImpl2. 声明_ATL_SINK_INFO 结构回调参数信息。在 OutlookAddin.h文件中加入下面语句: / 按钮事件响应信息声明extern _ATL_FUNC_INFO OnClickButtonInfo;在 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:DispEventAdvise(IDispatch*)m_spBu
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号