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

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

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

  [复制链接]

84

主题

61

听众

3088

积分

测试体验团员

系统分析师

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

该用户从未签到

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

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

发表于 2013-2-24 14:35 |显示全部楼层
分享到: 新浪微博 腾讯微博
本帖最后由 天远 于 2013-2-24 14:45 编辑
: s. N* r" U; K# t3 h- M6 `, [+ d- n! k, `+ {
本文是《WPS COM加载项制作连载教程》的第3篇,前两篇地址如下:
; }0 w0 D+ w) W2 k  t1、WPS COM加载项制作连载教程1; W* X6 Y) z9 @% @
     http://bbs.wps.cn/thread-22350125-1-1.html2 X& ~5 H0 Z* n9 R, R
2、WPS COM加载项制作连载教程2; t6 p4 ?. K/ }' y8 d; }
     http://bbs.wps.cn/thread-22350388-1-1.html) N; V7 j; E4 p! b, Y9 Q) Z- e8 a

# {7 n; I$ V+ C, x' EWPS Office 2012中,其COM加载项的实现机制与一个重要的接口有关,那就是 IDTExtensibility2 接口。我们要制作COM加载项,就要实现这个接口。; b- ~% v" m5 @! j, u! `/ u3 M
0 u9 }( n* |3 `1 v6 Y
首先,我们来认识这个接口,以ET为例,如图3 c% ^. d( S) V. e+ b! ^4 g

" _, l' k  Y8 s
6 P. `1 o  N- C; u( x( b5 v. E& g  {

4 g0 q. a& ~/ k; c& H# E5 {1 B% V, Z# _3 K
( l2 |& J! J% W4 u
8 V6 V9 a* y0 t* Y3 z
5 Q' n# I! I. \5 p6 @& J
) r3 ~3 C) e' x7 `% S. z- H/ ?
我们看到IDTExtensibility2有五个方法成员,也即事件,分别是% a, M' z$ f5 v, ?4 e
OnConnection
) I- V. A3 F  ]OnDisconnection
! M4 S3 a" `6 \: hOnStartupComplete
6 ]7 G+ T5 v2 b$ `. a6 Y; vOnAddInsUpdate2 m5 t2 {( o$ E
OnBeginShutdown" ^9 r( I3 R- B. o
" H8 G: l. Y5 O5 l& O6 C5 a- q% ^( b
下面,来一一介绍这五个事件的含义:(这些含义引用自 http://blog.csdn.net/MVC2008MVC/article/details/2560892)
+ F# L0 S9 ]1 q- o- O. F: n4 L' r
1.OnConnection 事件  J! S" r3 H  \# i/ D- ^
OnConnection 事件在 COM 加载项加载(连接)时发生。可以在OnConnection 事件中实现对WPS的操作,其中使用加载项有以下几种方式:
6 N7 z7 ]$ n1 V- R1 E. H当应用程序启动时加载;) F0 l; |' P0 i- Y
用户在“COM 加载项”对话框中加载加载项;
5 A2 o4 b7 U! F! d+ L6 g6 _% I* v在发布的时候,注册表的LoadBehavior键值表示加载行为,通常是3(启动时加载)。如果想让用户在“COM 加载项”对话框中加载加载项的话键值是8。
$ j" e1 S4 o3 ]2 S
# a4 ~5 s4 y/ P6 N; h: S2.OnDisconnection 事件
) a% h5 d! K$ J- }  Z' aOnDisconnection 事件在卸载 COM 加载项时发生。可以使用 OnDisconnection 事件过程运行能够恢复由加载项对应用程序所作任何更改的代码,或者执行常规清除操作。
" j: Q5 @& c6 ?4 g卸载加载项和加载行为有对应的几种方式:
% M  ?* K2 p! n4 P用户清除“COM 加载项”对话框中加载项旁边的复选框。 6 d" e9 O& x0 ~# {
WPS程序关闭时卸载。如果加载项的加载行为设置为“启动”,则WPS 程序再次启动时,就会重新加载加载项。 # X! h! H% R( a! g3 O5 u) `

3 ~+ H" q" {1 S" ?, k8 I- L/ S3.OnStartupComplete 事件% j8 Y: d  Y6 F4 m  p  ]
当WPS程序完成启动例程时,就会发生 OnStartupComplete 事件。事件只在“启动时加载COM加载项”的加载行为下发生。如果此事件确实发生,则它将在 OnConnection 事件之后发生。' U/ p! A8 t  P. g  d
可以使用 OnStartupComplete 事件与应用程序交互、且在应用程序完成加载后才应运行的代码。例如,如果要显示一个使用户选择在启动WPS文字程序时选择公文模板的窗体,可以将该代码放到 OnStartupComplete 事件过程中。
0 I9 j$ ~' r6 j% c6 E& D( f9 {3 m
! o& o; `" K: u& S: k: C4.OnBeginShutdown 事件, E& }+ I0 F& @7 o5 S
在WPS程序关闭而 COM 加载项仍处于加载状态的情况下,如果WPS程序开始其关闭例程时就会发生 OnBeginShutdown 事件。如果此事件确实发生,它将在 OnDisconnection 事件之前发生。
( L% N( a* y1 L* v用户关闭WPS程序时,可以使用 OnBeginShutdown 事件过程运行代码。例如,可以运行将窗体数据保存到某个文件的代码。
5 }! e5 g  R* j! x
* h8 X& J+ Z! k3 J# d. Q8 P5.OnAddInsUpdate 事件6 x! }/ F+ S* O0 E
当一组已加载的 COM 加载项发生更改时,就会发生 OnAddInsUpdate 事件。当某个加载项加载或卸载时,就会在任何其它已加载的加载项中发生 OnAddInsUpdate 事件。例如,如果加载项 A 和 B 当前已加载,然后将加载加载项 C,则 OnAddInsUpdate 事件就会在加载项 A 和 B 中发生。如果 C 已卸载,则加载项 A 和 B 中再次发生 OnAddInsUpdate 事件。
1 a5 Q+ H* |/ y: T0 b+ r
. q- v" K1 N/ h' }" v# Z% P" V根据这五个事件的触发时机可以组合使用来实现很多有用的功能,大大减小WPS二次开发的难度。
" H$ S+ G  _# e, r8 e
( i* ?: o- C% C9 J/ ~! i( C- w& C: J: N0 w% ~! @
接下来,我们来演示IDTExtensibility2接口的实现
- c6 K( O' B9 N2 @4 [* `, }+ |8 ]3 a% \, T0 u
(以下的代码要写在VB工程类模块中,注意是VB工程,而不是我们现在的VBA,具体操作见下一讲或参考 http://bbs.wps.cn/thread-22333226-1-1.html)" q$ q! U8 B7 i1 ?: W) k
(在这里只是先解释代码的含义)' z- k* E  ]8 I! [6 _8 M! `$ ~  E
  H7 Y9 u5 h4 c- N6 s  k
(以下代码经过加行号和高亮处理,直接复制可能带来问题,请下载附件:)
6 Z* w9 k) J- y, \

# ^+ D0 z4 R* m/ L6 L01 Option Explicit '强制显示声明
( A- x( K' M" y3 s+ ~7 ^. i: U1 S02 Implements IDTExtensibility2 '声明实现IDTExtensibility2接口
+ E0 [. [- {) `03
* @  Z/ I# {) G6 P; f) n$ |04 Private WithEvents etApp As ET.Application '声明一个变量,用于存放ET应用程序的实例
& y2 P8 J: _" n. ?$ g* a( f05
4 p2 L: Y' W2 }" S) X; a06 '实现OnConnection, T3 ~& o. U5 ]9 F( J
07 Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
+ H- _1 a  r+ a' u8 z8 y% v08     '这里指的是COM加载项加载时的操作,一般在这里初始化应用程序的实例0 o- w( ]. X1 v% e/ n/ }; W: w1 i
09     On Error Resume Next
& L+ w, [1 w- F& d/ s9 K10     Set etApp = Application '这里Application就代表ET应用程序,因此赋值给etApp
6 i8 h& t( z; _11 End Sub, ]( K4 X- j% w" C3 f- w/ Y
12
2 T# F& q8 d% f6 C$ `6 Z! X) C1 U13 '实现OnDisconnection+ c3 d/ W/ D4 y& k9 D
14 Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)  p. B) _6 ]8 q2 a* e) r
15     '这里指的是COM加载项卸载时的操作,一般在这里销毁应用程序的实例; g, f9 O9 E) J: q. h- Q
16     On Error Resume Next$ Q/ ~6 i3 P7 k9 x* d1 r; F
17     Set etApp = Nothing '销毁etApp变量
* u! N2 M; G/ i( t$ u18 End Sub
- M! R3 b# ]3 A8 r7 p; j! l3 L19 : ^. g! u, t: n4 ^. w: G
20 '实现OnStartupComplete6 i- X6 j2 j6 b: a' k
21 Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)
- q. g9 T; G4 X- a5 h6 u22     '这里指的是COM加载项加载完成时的操作,这里我们在当前工作表中写入一些内容8 J- t' _/ F+ N9 B& j4 _
23     On Error Resume Next# @! M6 Z( n) D+ T5 g1 {
24     With etApp.ActiveSheet
% \9 `& f8 t  u* P4 ?2 m25         .Cells(1, 1) = "WPS"; v# e3 k- o9 u" ^# S
26         .Cells(2, 1) = "COM"9 Z/ e; r/ q5 ^- |# h2 N% ]
27         .Cells(3, 1) = "加载项"
* |" |' I6 ~% E, k28     End With0 A1 E2 V0 ]5 p3 h
29 End Sub; v& h0 f) R  F$ |
30   f7 }' q9 }& r( U
31 '实现OnAddInsUpdate
7 f" r0 ^1 r, C  u5 T' r2 |& W32 Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
5 W- V! l; [& q5 _2 [33     '这里一般不需要执行操作,为空
/ T$ o# P# l: ^, s4 G& |) D$ c34 End Sub
1 d% k; k  n% V! ^! h35
9 J' J, `6 Z( s36 '实现OnBeginShutdown
0 b+ t9 X3 _% V" v: X1 ]37 Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
$ P' ]  ~) r- `7 J! g38     '这里一般不需要执行操作,为空; d8 ]+ L+ h! a: k- u  g4 o4 j( g
39 End Sub1 b( ?# K; O/ B0 v/ j
8 X- J" e' Y: Z9 m; m, }
这一讲到这里就结束了,下一讲,我们就要用开发工具(VB)来制作真正的COM加载项了。

# P' e" f& k, ~$ A7 Y9 q  Y3 G- n/ u5 @6 s

本帖子中包含更多资源

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

点评

赞同: 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

主题

111

听众

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

听众

97

积分

LV.2

Rank: 2

该用户从未签到

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

使用道具 举报

84

主题

61

听众

3088

积分

测试体验团员

系统分析师

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

该用户从未签到

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

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

发表于 2013-5-24 08:32 |显示全部楼层
mingch2008 发表于 2013-5-23 20:41 0 q8 }( }. c. }8 P2 s* M
天远兄,下一讲的地址在哪呀,怎么没有找到

6 @8 O' b$ F5 d- @* q- M! X+ y. D$ \5 M下一讲还没出
回复

使用道具 举报

0

主题

0

听众

3

积分

LV.1

Rank: 1

该用户从未签到

金币
0
威望
5
帖子
1
精华
0
发表于 2013-5-27 09:51 |显示全部楼层
天远 发表于 2013-5-24 08:32 # I) Z  j6 H( x% F8 Z/ j
下一讲还没出
9 g) I1 M# p( p3 O4 t+ O
天远兄,什么时候能出啊?!{:1_4:}
回复

使用道具 举报

84

主题

61

听众

3088

积分

测试体验团员

系统分析师

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

该用户从未签到

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

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

发表于 2013-5-27 13:48 |显示全部楼层
shenjg@163.com 发表于 2013-5-27 09:51 - r. n* S# b: r, Z2 J: P, W0 f
天远兄,什么时候能出啊?!

* m! ~8 y  S: |* p2 H. b, K/ u不好意思,在忙学位论文的事情,可能要过些日子
回复

使用道具 举报

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

快速回帖:

fastpost

WPS论坛更新日志|WPS Office官方论坛 ( 粤公网安备 44049102496073号 粤ICP备13015957号-1   

GMT+8, 2018-1-22 16:38

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部