ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 24943|回复: 27

[原创] 我的第一个COM加载项习作

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-3-12 06:19 | 显示全部楼层 |阅读模式

应用COM加载项技术的愿望久矣,两年来,断断续续的学习探索,一直没有什么突破(参考http://office.9zp.com/dispbbs.asp?boardID=15&ID=220&page=1),主要的瓶颈在于无法将当前的命令应用于所有打开/新建的文档,即便是大头版主的代码,感觉也很些问题(烦琐),而且也无法应用于Word自带菜单(命令)下的自定义按钮中。

近日,夜不成寐。幸得MVP陈希章的帮助,给我MSDN中的一个链接(如何使用 Visual Basic .NET 生成 Office COM 加载项,http://support.microsoft.com/default.aspx?scid=kb;zh-cn;302896),所有问题几乎迎刃而解。

不敢私藏,与版友们一起分享之。

COM加载项的代码如下:

Option Explicit
Implements IDTExtensibility2 '声明一个对实现 IDTExtensibility2(COM加载项) 的类型库的引用
Dim WithEvents MyButton As Office.CommandBarButton '声明myButton为Office.CommandBarButton类
Dim applicationObject As Word.Application '声明applicationObject为Word.Application对象

Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
'每当连接 COM 加载项时,都会激发 OnConnection 事件⑴
    Set applicationObject = Application '指向Application对象
    '如果连接的方式不是由宿主应用程序的启动行为(Word/宿主应用程序的Startup)引起的连接(指通过WORD/工具/COM加载项/
    'COM加载项对话框进行的加载时,先发生OnConnection事件,再调用OnStartupComplete事件,以便重新生成/取得对CommandBarButton的引用
    If (ConnectMode <> AddInDesignerObjects.ext_ConnectMode.ext_cm_Startup) Then _
           Call IDTExtensibility2_OnStartupComplete(custom)
End Sub

Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
'IDTExtensibility2_OnAddInsUpdate事件存根,无代码
'每当注册的 COM 加载项集发生变化时,将激发 OnAddInsUpdate 事件。
'即每当安装 COM 加载项或者从宿主应用程序中删除 COM 加载项时,都会激发此事件。
'该事件在COM加载项的OnConnection事件之后发生⑵
'当正确加载该COM加载项后,其ADDINS集合发生改变后,再次引发此事件⑶
End Sub

Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)
'当Word程序完成与加载项的连接以后,加载该加载项后触发此事件.⑷
        Dim oStandardBar As CommandBar
        On Error Resume Next
       Set oStandardBar = applicationObject.CommandBars("Standard") 'Word 〖常用〗工具栏
        Set MyButton = oStandardBar.Controls("OK") '如果没有此对象
         If MyButton Is Nothing Then
            Set MyButton = oStandardBar.Controls.Add(1) '新增
            With MyButton
                .Caption = "OK"
                .Style = Office.MsoButtonStyle.msoButtonIconAndCaption
                .Tag = "OK"
                .Visible = True
                .FaceId = 609
            End With
            End If
       Set oStandardBar = Nothing
End Sub

Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
'Word程序关闭解除与COM加载项连接前,触发此事件⑸
         On Error Resume Next
         'myButton对象丢失(?)
         applicationObject.CommandBars("Standard").Controls("OK").Delete
         applicationObject.NormalTemplate.Save '删除按钮之前Normal.dot已保存并关闭,所以必须再次保存
     Set MyButton = Nothing
End Sub

Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
'当 COM 加载项断开连接并且在它从内存中卸载之前,将激发 OnDisconnection 事件⑹
'主要应用于关闭宿主应用程序时发生此事件.
'如在Word/工具/COM加载项/COM加载项对话框中,卸载/或者删除该加载项时发生此事件
'加载项应在此事件中执行所有资源清理操作,并还原对宿主应用程序所做的任何更改。
'如果由用户卸载(断开同COM加载项的连接时)COM加载项时,调用OnBeginShutdown事件
If RemoveMode <> AddInDesignerObjects.ext_DisconnectMode.ext_dm_HostShutdown Then Call IDTExtensibility2_OnBeginShutdown(custom)
       Set applicationObject = Nothing '释放对象变量
End Sub

Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox MyButton.Caption, vbInformation, "ExcelHome_ShouRou"
End Sub

成品如下,如需加载,请先注册该DLL文件

p46MwpBP.rar (6.06 KB, 下载次数: 588)

TA的精华主题

TA的得分主题

发表于 2008-3-12 09:10 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-3-13 06:35 | 显示全部楼层

发现一个BUG,还是myButton对象丢失的问题,不解,郁闷。

更正一个过程代码:

Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox Ctrl.Caption & ":Hello,Word!", vbInformation, "ExcelHome_ShouRou"
End Sub

这是更新后的DLL压缩文件:

GoqDiyY9.rar (6.09 KB, 下载次数: 209)


以上路径为DLL解压路径。

我的第一个COM加载项习作

我的第一个COM加载项习作

我的第一个COM加载项习作

我的第一个COM加载项习作

我的第一个COM加载项习作

我的第一个COM加载项习作

我的第一个COM加载项习作

我的第一个COM加载项习作

TA的精华主题

TA的得分主题

发表于 2008-3-13 17:17 | 显示全部楼层
这个太厉害了,我用都不会用,注册后如何加载?

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-3-13 18:03 | 显示全部楼层
QUOTE:
以下是引用byld在2008-3-13 17:17:24的发言:
这个太厉害了,我用都不会用,注册后如何加载?

注册完成后,重新启动Word,然后会在常用工具栏的最右侧出现一个“OK”的命令,单击此命令即可。

TA的精华主题

TA的得分主题

发表于 2008-3-15 09:30 | 显示全部楼层

谢谢老大的分享,WPS在没有VBA的环境下的开发,必须要使用COM加载项,才能完成。

现献上一个WPS做COM加载项的规范教程,Word也是一样的。

MJgmVKzA.rar (46.02 KB, 下载次数: 475)
[此贴子已经被作者于2008-3-15 9:31:40编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-3-15 12:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
QUOTE:
以下是引用konggs在2008-3-15 9:30:54的发言:

谢谢老大的分享,WPS在没有VBA的环境下的开发,必须要使用COM加载项,才能完成。

现献上一个WPS做COM加载项的规范教程,Word也是一样的。



感谢孔兄,教程很规范。

现在唯一的遗憾是打包的问题,就是自动安装并注册DLL的问题,使用VB的打包程序PACKAGE & Deployment 向导制作的安装包,文件也太大了些(也许方法不大),其他的自动方式一时半会儿也没找到。

不知孔兄是否有良方,分享一下?

TA的精华主题

TA的得分主题

发表于 2008-3-15 13:36 | 显示全部楼层

守兄:

建议:用Wise Installation System9.0 制作打包程序吧,非常专业,而且也容易上手!

TA的精华主题

TA的得分主题

发表于 2008-3-15 14:09 | 显示全部楼层

老大好。我们常用也是老土的方法。

就是将dll + 写注册表文件 + 一个批处理文件放在一个目录下。

写注册表文件(add.reg)

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Kingsoft\Office\WPS\Addins\myPro.myCls]
"FriendlyName"="WPS BackGround Adder"
"Description"="WPS另存为html"
"LoadBehavior"=dword:00000003
"CommandLineSafe"=dword:00000001

如果要安装,就双击他,

intall.bat

@regedit /s add.reg
@regsvr32 /s temp.dll

如果要卸载,就双击另一个,例如、

unstall.bat

@regsvr32 /s /u temp.dll
@regedit /s UnRegaddin.reg

卸载注册表文件(UnRegaddin.Reg的):

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Software\Kingsoft\Office\WPS\Addins\myPro.myCls]

因为我们通常是给别人参考学习,所以,是明码。

srg兄提供的软件应该是一个不错的选择,我试了一下,很好用。

[此贴子已经被作者于2008-3-15 16:08:30编辑过]

TA的精华主题

TA的得分主题

发表于 2008-3-15 23:51 | 显示全部楼层
QUOTE:
以下是引用守柔在2008-3-13 6:35:22的发言:

发现一个BUG,还是myButton对象丢失的问题,不解,郁闷。

三年前我也有同样的困惑,在MSDN中找到了解决方法:加载项在Word中运行,将CommandBarButton对象的Tag属性设置为唯一的String值可解决问题。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 02:40 , Processed in 0.049753 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表