最新WPS办公软件学习教程_免费企业办公软件下载_金山WPS Office官网论坛

 找回密码
 
查看: 22193|回复: 43

[VBA/VBS教程] WPS COM加载项制作连载教程3——详解IDTExtensibility2接口

  [复制链接]

84

主题

59

听众

3088

积分

测试体验团员

系统分析师

Rank: 14Rank: 14Rank: 14Rank: 14

该用户从未签到

金币
984
威望
8204
帖子
842
精华
3

WPS粉丝团 技术分享团 解答支持团 测试体验团 重阳节勋章 技巧教程分享达人 最佳教程奖 优秀会员奖

发表于 2013-2-24 14:35 |显示全部楼层
分享到: 新浪微博 腾讯微博
本帖最后由 天远 于 2013-2-24 14:45 编辑 - s9 A* O0 \5 q
( z4 C8 b+ C, |6 H, ^+ C1 u1 A& o. T
本文是《WPS COM加载项制作连载教程》的第3篇,前两篇地址如下:
' u" D2 \: l5 i& D1、WPS COM加载项制作连载教程1
* f2 {2 ^8 x+ U' Z     http://bbs.wps.cn/thread-22350125-1-1.html
- V2 o# `+ _$ B$ p2、WPS COM加载项制作连载教程2, S% z  B. P  u( F4 }
     http://bbs.wps.cn/thread-22350388-1-1.html
; X# O5 l( _2 F2 e, w3 z: ^. {1 e/ @' Z9 A+ ?; ~" o
WPS Office 2012中,其COM加载项的实现机制与一个重要的接口有关,那就是 IDTExtensibility2 接口。我们要制作COM加载项,就要实现这个接口。
3 `# x1 S% ]/ h4 N2 q9 B7 ^' n4 r( d5 Q  }) J$ J8 w5 o7 G$ ]
首先,我们来认识这个接口,以ET为例,如图
: b) W7 y' b2 I& ?, n  v' b, ]- a2 v

) P% o. I3 A. l8 J. X# ]" G* ]- p
- |" a- V2 n4 g! L! {( r
: M+ |6 a9 L" d1 y; ?5 R& c% p* o& C0 b0 Q. U
- ?" V0 ]; d% V6 ^7 v! a
1 m8 b7 |8 C' n

: f8 Z* v3 ?5 {9 x2 |
4 [) B  M! f" I我们看到IDTExtensibility2有五个方法成员,也即事件,分别是
$ k: ^6 z& X& I" z0 l$ cOnConnection7 \2 ^. D. d! W* i! u. F% p" {! R0 t
OnDisconnection$ B* M8 L" L" V) d+ X/ P2 A4 X
OnStartupComplete. ?/ Q- S) a4 Z- t4 y" R! F
OnAddInsUpdate
5 ?" l' c; N0 L$ J' G. iOnBeginShutdown1 ^, a- y# Y2 I
0 t- ^7 \! A9 b# i" z- s( E8 y
下面,来一一介绍这五个事件的含义:(这些含义引用自 http://blog.csdn.net/MVC2008MVC/article/details/2560892)- x1 h8 ~6 d4 C$ V1 R, D8 A
. ]* e4 h0 J& l* \
1.OnConnection 事件
. x) B" l# O; \# r( _OnConnection 事件在 COM 加载项加载(连接)时发生。可以在OnConnection 事件中实现对WPS的操作,其中使用加载项有以下几种方式:
) Q" j# {) D/ g# P$ h0 `7 T当应用程序启动时加载;& @' i! t9 T3 ?1 A
用户在“COM 加载项”对话框中加载加载项;  U6 Y' _! [, D6 T- @
在发布的时候,注册表的LoadBehavior键值表示加载行为,通常是3(启动时加载)。如果想让用户在“COM 加载项”对话框中加载加载项的话键值是8。- A7 ]; P' W9 F6 }+ Z

8 D9 E5 Z! m5 p- k7 r% r0 ^* X: o2.OnDisconnection 事件8 P3 m# z7 {' ~) w8 j# K) W
OnDisconnection 事件在卸载 COM 加载项时发生。可以使用 OnDisconnection 事件过程运行能够恢复由加载项对应用程序所作任何更改的代码,或者执行常规清除操作。
# n) P( F+ e4 u$ _% l" z& o卸载加载项和加载行为有对应的几种方式:
# }* N" F0 l3 p; r; M8 b+ N+ _用户清除“COM 加载项”对话框中加载项旁边的复选框。 * Z- K4 U3 p1 i
WPS程序关闭时卸载。如果加载项的加载行为设置为“启动”,则WPS 程序再次启动时,就会重新加载加载项。
$ e9 _+ @  y; H' M9 _4 ?. |3 }4 b
3.OnStartupComplete 事件
1 `3 W6 N8 K4 @& B当WPS程序完成启动例程时,就会发生 OnStartupComplete 事件。事件只在“启动时加载COM加载项”的加载行为下发生。如果此事件确实发生,则它将在 OnConnection 事件之后发生。
) M# C2 E) ?" D" O( Z3 D# \可以使用 OnStartupComplete 事件与应用程序交互、且在应用程序完成加载后才应运行的代码。例如,如果要显示一个使用户选择在启动WPS文字程序时选择公文模板的窗体,可以将该代码放到 OnStartupComplete 事件过程中。
9 p! y8 u5 J/ n# E3 T# z7 h) M% H9 f, ~* R9 J, O0 {
4.OnBeginShutdown 事件7 x6 c# ^* E" r8 F
在WPS程序关闭而 COM 加载项仍处于加载状态的情况下,如果WPS程序开始其关闭例程时就会发生 OnBeginShutdown 事件。如果此事件确实发生,它将在 OnDisconnection 事件之前发生。
. K. M9 c8 t- Z& T8 K) y用户关闭WPS程序时,可以使用 OnBeginShutdown 事件过程运行代码。例如,可以运行将窗体数据保存到某个文件的代码。6 P3 U. ]4 d- v. y1 v

* M% T" b# j. G- m5.OnAddInsUpdate 事件& @, T2 G& @! I$ {; e, X
当一组已加载的 COM 加载项发生更改时,就会发生 OnAddInsUpdate 事件。当某个加载项加载或卸载时,就会在任何其它已加载的加载项中发生 OnAddInsUpdate 事件。例如,如果加载项 A 和 B 当前已加载,然后将加载加载项 C,则 OnAddInsUpdate 事件就会在加载项 A 和 B 中发生。如果 C 已卸载,则加载项 A 和 B 中再次发生 OnAddInsUpdate 事件。
# `! d7 V5 u' K
, `+ `6 i( z" P8 h  V* Y根据这五个事件的触发时机可以组合使用来实现很多有用的功能,大大减小WPS二次开发的难度。
  J  d! s* t8 K7 H! O! P% \9 }8 l) _0 @8 N5 _/ L1 G5 R/ V7 T5 D( R
: v6 b3 @' o) i5 g8 v
接下来,我们来演示IDTExtensibility2接口的实现
! F* D+ U: J6 a3 a3 J5 }* j4 B' }# T* |) J
(以下的代码要写在VB工程类模块中,注意是VB工程,而不是我们现在的VBA,具体操作见下一讲或参考 http://bbs.wps.cn/thread-22333226-1-1.html)
; y5 P3 ]+ k/ |, F0 m. n) ^7 P(在这里只是先解释代码的含义)2 u: E- P. I+ M, Z6 n( S# t

, P4 Q% H+ w1 m! d" N(以下代码经过加行号和高亮处理,直接复制可能带来问题,请下载附件:)

  X& P# |! w4 _4 A3 n! N2 t: Y1 V$ C0 |4 l
01 Option Explicit '强制显示声明' L4 J) @& a% ]
02 Implements IDTExtensibility2 '声明实现IDTExtensibility2接口( j$ Y& W8 B5 Q  J& \) _
03
, z# l: L1 ~9 r0 p7 P1 G5 ?04 Private WithEvents etApp As ET.Application '声明一个变量,用于存放ET应用程序的实例2 d3 y% _7 W- b0 c! h
05   P8 ~1 Y+ F) J1 K
06 '实现OnConnection
0 ]( z6 ?3 Z, d, U7 R2 w07 Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
6 A; e. b% @# K) L- l) k08     '这里指的是COM加载项加载时的操作,一般在这里初始化应用程序的实例3 m4 a3 A/ A& E
09     On Error Resume Next
8 u+ X7 m. h# X" n' u7 X  k% F10     Set etApp = Application '这里Application就代表ET应用程序,因此赋值给etApp( a# H/ n/ u( X8 f1 D; i, l
11 End Sub
2 M: y5 t+ z& w( N% j: k1 b! ~12 " _1 y2 |: ^. a! G3 y) i, Z
13 '实现OnDisconnection6 x- ^2 r7 T$ g2 E
14 Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)7 z, `9 k' F0 ]. t* f; A# h; `9 o
15     '这里指的是COM加载项卸载时的操作,一般在这里销毁应用程序的实例
6 v5 N, [" g5 Q, L, E, Z9 B16     On Error Resume Next! W, |( T" h  i% {- ]3 d
17     Set etApp = Nothing '销毁etApp变量
( g+ c8 w4 H: J7 Q" C4 G18 End Sub2 C- v' x' F& I3 u& b3 I
19
- M8 h+ P' |* S. N$ V$ C* y20 '实现OnStartupComplete
8 w# }' ]% ^) a21 Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)) m) F" l" U) |# j" f5 ^; }3 h
22     '这里指的是COM加载项加载完成时的操作,这里我们在当前工作表中写入一些内容' P9 H4 X, @+ E) ?
23     On Error Resume Next
. U! D: d7 q! H3 B24     With etApp.ActiveSheet
. Q% j1 X9 l5 }# z25         .Cells(1, 1) = "WPS"
, g; M7 X! E. l! Z& T26         .Cells(2, 1) = "COM"
" m' Z/ v  i: ?  Z/ q27         .Cells(3, 1) = "加载项"
1 _' B& L. ?. o8 ?% o' o) [" e0 V: e28     End With
, b! Y$ ], u9 _, T/ u29 End Sub
/ P9 ]  _# Q4 Y* i5 q' g  x8 t30 8 k" W. v  g, i1 U
31 '实现OnAddInsUpdate
" B2 ?0 X2 W0 t9 z0 f32 Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
3 N$ f* ~$ j' f$ G* a8 \33     '这里一般不需要执行操作,为空
  [1 Y! Y% {, Z* B( X3 r  e% v34 End Sub2 _+ d# }# I) ^/ @% z0 a
35
2 h( T6 b5 H4 B/ t; L36 '实现OnBeginShutdown
& h3 E+ X) \& A8 i6 Y37 Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
, J# q4 b4 w5 u' T9 g! [38     '这里一般不需要执行操作,为空' ^4 T# w  I0 s8 ^
39 End Sub: `- ~: }4 S+ y! ?# X

7 p+ ^8 @, q5 Y; l* _这一讲到这里就结束了,下一讲,我们就要用开发工具(VB)来制作真正的COM加载项了。
/ m% o/ E+ a; ~* ^( e9 \2 X$ T& @

$ t! @2 |- e# p, W, d9 d

本帖子中包含更多资源

您需要 登录 才可以下载或查看,

点评

赞同: 5.0
翘尾的k  赞同: 5
  发表于 2013-4-5 18:11
已有 3 人评分威望 收起 理由
翘尾的k + 5 很给力!
user + 2 赞一个!
松风水月 + 20 很给力!

总评分: 威望 + 27   查看全部评分

热爱分享和学习。希望WPS论坛越办越好,WPS软件越做越好。也希望能在这里交到更多志同道合的朋友。我的邮箱:ypr@yprnet.com
我在WPS论坛上的教程帖子合集: http://blog.yprnet.com/wps

19

主题

106

听众

5338

积分

技术分享团长

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

签到天数: 5 天

[LV.2]偶尔看看I

金币
5316
威望
11825
帖子
2334
精华
1

WPS粉丝团 荣誉版主奖 活跃会员奖 技术分享团 解答支持团 重阳节勋章

发表于 2013-2-25 12:47 |显示全部楼层
感谢天远!{:soso_e183:}
回复

使用道具 举报

69

主题

4

听众

2095

积分

测试体验团员

Rank: 14Rank: 14Rank: 14Rank: 14

签到天数: 3 天

[LV.2]偶尔看看I

金币
232
威望
4111
帖子
1146
精华
0

WPS粉丝团 测试体验团

发表于 2013-3-30 21:11 |显示全部楼层
十分感谢,继续学习中
欢迎访问 嘀噫空间-DESpace:www.xx10.cn
百度DE空间团队邀您一起帮助他人
回复

使用道具 举报

13

主题

9

听众

1459

积分

LV.7

Rank: 7Rank: 7Rank: 7

签到天数: 1 天

[LV.1]初来乍到

金币
456
威望
3277
帖子
721
精华
0
发表于 2013-4-5 14:23 |显示全部楼层
非常好,赞一个.
回复

使用道具 举报

0

主题

0

听众

3

积分

LV.1

Rank: 1

该用户从未签到

金币
0
威望
5
帖子
0
精华
0
发表于 2013-4-6 22:44 |显示全部楼层
十分感谢,继续学习中
回复

使用道具 举报

0

主题

0

听众

131

积分

LV.3

Rank: 3Rank: 3

该用户从未签到

金币
5
威望
206
帖子
137
精华
0
发表于 2013-4-9 12:23 |显示全部楼层
行,有意义,我顶 谢谢您了                  
回复

使用道具 举报

3

主题

0

听众

90

积分

LV.2

Rank: 2

该用户从未签到

金币
0
威望
183
帖子
42
精华
0
发表于 2013-5-23 20:41 |显示全部楼层
天远兄,下一讲的地址在哪呀,怎么没有找到
回复

使用道具 举报

84

主题

59

听众

3088

积分

测试体验团员

系统分析师

Rank: 14Rank: 14Rank: 14Rank: 14

该用户从未签到

金币
984
威望
8204
帖子
842
精华
3

WPS粉丝团 技术分享团 解答支持团 测试体验团 重阳节勋章 技巧教程分享达人 最佳教程奖 优秀会员奖

发表于 2013-5-24 08:32 |显示全部楼层
mingch2008 发表于 2013-5-23 20:41
$ D! V+ ]/ ?/ I天远兄,下一讲的地址在哪呀,怎么没有找到
$ {, C0 P+ l) R5 ~
下一讲还没出
回复

使用道具 举报

0

主题

0

听众

3

积分

LV.1

Rank: 1

该用户从未签到

金币
0
威望
5
帖子
1
精华
0
发表于 2013-5-27 09:51 |显示全部楼层
天远 发表于 2013-5-24 08:32 - T4 c, b' B1 o( z
下一讲还没出
9 x6 n/ x" c) l0 b# j% P  s
天远兄,什么时候能出啊?!{:1_4:}
回复

使用道具 举报

84

主题

59

听众

3088

积分

测试体验团员

系统分析师

Rank: 14Rank: 14Rank: 14Rank: 14

该用户从未签到

金币
984
威望
8204
帖子
842
精华
3

WPS粉丝团 技术分享团 解答支持团 测试体验团 重阳节勋章 技巧教程分享达人 最佳教程奖 优秀会员奖

发表于 2013-5-27 13:48 |显示全部楼层
shenjg@163.com 发表于 2013-5-27 09:51 0 r9 j8 m1 [6 o2 l6 v, d9 [& r
天远兄,什么时候能出啊?!
* ^7 a% {: B! g) @7 A
不好意思,在忙学位论文的事情,可能要过些日子
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 更多账号登录:

快速回帖:

fastpost

WPS论坛更新日志|WPS Office官方论坛     

GMT+8, 2017-11-20 08:07

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部