ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:24.81KB ,
资源ID:11413237      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11413237.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第七章建立服务程序.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第七章建立服务程序.docx

1、第七章 建立服务程序2.4 第七章 建立服务程序 本章给出下面的内容: 服务程序概念 建立服务程序的策略 CRTSRVPGM命令简介 服务程序的例子2.4.1服务程序概述 服务程序是一个连接程序(类型为*SRVPGM),它由一系列过程组成,这些过程可以由其他连接程序中的过程调用。 服务程序是典型的公用函数,它在应用程序内和应用程序之间频繁调用。例如,ILE编译程序使用服务程序来提供运行期间服务,象数学函数和输入/输出子例程。使用服务程序的好处是,可重复使用,维护简单,减少存储空间。 服务程序与程序的区别,表现在两个方面: 它不包括程序入口过程。这意味着不能用CALL操作调用服务程序。 服务程序

2、通过引用,连接到其它程序或服务程序中。 当把服务程序连接到程序时,服务程序的内容并没有拷贝到程序中,而是服务程序的连接信息被连接到程序中。和连接模块到程序中的静态连接相对应,这种连接叫做“引用连接”。 因为服务程序是通过引用连接到程序上,所以可以使用CALLB操作调用服务程序的出口过程。由于是通过引用连接,所以调用有一定数量的开销,但是,随后对它的过程的任何调用都比程序调用快。 服务程序中的一系列出口是,它所提供的服务的接口。可以使用显示服务程序CDSPSRVPGM命令或服务程序清单,来查看哪些变量用于过程调用。2.4.2建立服务程序的策略 当建立服务程序时,应当注意: 1.是否希望以后更新该

3、程序。 2.是否某些更新会引起接口的改变(即使用的进口和出口)。 如果服务程序的接口改变了,那么就必须重新连接那些与原服务程序连接的程序。如果所做的修改是向上兼容的,并且是用连接语言建立的服务程序,那么也许可以减少重新连接的数量。在这种情况下,当更新连接语言源程序,来标识新的出口后,只需重新连接那些使用他们的程序。 连接语言让你控制服务程序的出口,当你要做以下的事情时这种控制是很有用的: 给服务程序用户包装某些服务程序产品 改正问题 增强功能 减小因为修改对应用程序用户造成的影响 关于使用连接语言建立服务程序的例子,参见2.4.4节中的“样本服务程序”。 关于连接语言,出口处理及其它服务程序概

4、念,参见ILE概念。2.4.3使用CRTSRVPGM命令建立服务程序 使用建立服务程序命令(CRTSRVPGM)建立服务程序。任何ILE模块都可以被连接到服务程序中。在你用它来建立服务程序前,模块必须是已经存在的。 表6列出了CRTSRVPGM命令的参数及默认值。关于CRTSRVPGM命令及其参数的完整描述,参见CL参考手册。 表6. CRTSRVPGM命令的参数以及他们的默认值参数组 参数(默认值)标识 SRVPGM(库名/服务程序名) MODULE(*SRVPGM)程序访问 EXPORT(*SRCFILE) SRCFILE(*LIBL/QSRVSRC) SRCMBR(*SRVPGM)连接

5、BNDSRVPGM(*NONE) BNDDIR(*NONE)运行时 ACTGRP(*CALLER)其它 OPTION(*GEN *NODUPPRC *NODUPVAR *WARN *RSLVREF) DETAIL(*NONE) ALWUPD(*YES) ALWRINZ(*NO) REPLACE(*YES) AUT(*LIBCRTART) TEXT(*ENTMODTXT) TGTRLS(*CURRENT) USRPRF(*USER) 关于使用CRTSRVPGM命令的例子,参见2.4.4.1节中的建立服务程序。2.4.3.1修改服务程序 可以用程序目标相同方法更新或修改服务程序。也就是说,你可以:

6、 更新服务程序(使用UPDSRVPGM) 修改优化级(使用CHGSRVPGM) 删除可视性(使用CHGSRVPGM) 缩减尺寸(使用CPROBJ) 关于以上几点的详细资料,参见2.3.4节中的“修改模块或程序”。2.4.3.2相关的CL命令 以下的CL命令也可以对服务程序使用: 修改服务程序(CHGSRVPGM) 显示服务程序(DSPSRVPGM) 删除服务程序(DLTSRVPGM) 更新服务程序(UPDSRVPGM) 处理服务程序(WRKSRVPGM)2.4.4样本服务程序 以下的例子显示了如何建立服务程序CNTTOHEX,该程序把字符串转换为与之等价的十六进制形式。有两个参数需要传递给服务

7、程序: 1.要转换的字符型字段(Instring) 2.包含两个字节的十六进制数的字符型字段(Hexstring) Hexstring字段用来存储转换结果,并且也表示要转换的字符串的长度。例如,如果被传递的是30个字符长的字符串,但是你只想转换前10个,那么你只需传递20个字节长(2乘10)的串作为第二个参数。根据所传递的字段的长度,服务程序决定要处理的长度。 图26给出了服务程序的源语句。 服务程序中过程的基本逻辑如下所示: 1.使用操作描述来确定传递参数的长度。 2.确定要转换的长度:该长度值是字符串长度的最小值或16进制字段的二分之一。 3.使用子例程GetHex把字符串中的每个字符转换

8、成与之相等价的两字节十六进制值。 4.过程返回到调用者。 该服务程序使用了操作描述,它是ILE的构成部分,当事先不知道所传递的参数的确切属性时使用它,在本例中是长度。当在CALLB操作上指定了操作扩展符(D),那么在调用过程时就建立操作描述。 要使用操作描述,服务程序必须调用ILE的可连接API,CEEDOD(接收操作描述)。这个API要求必须定义CALLB操作的某些参数。但它是提供所需信息的最后一个参数,即长度。关于操作描述的详细信息,参见2.6.3.3节中的“使用操作描述”。 *=* * CVTTOHEX把输入串转换成十六进制的输出串。 * * * * 注:必须传递操作说明符。 * * *

9、 *=* *-* * 程序参数: * * 1.输入:字符串(N) * * 2.输入:十六进制(2n) * *-* D InString S 16383 D HexString S 32766 *-* * CEEDOD的二进制参数(从操作说明符得来) * *-* D ParmNum S 9B 0 D DescType S 9B 0 D DataType S 9B 0 D DescInfo1 S 9B 0 D DescInfo2 S 9B 0 D InLen S 9B 0 D HexLen S 9B 0 *-* * 程序所用的其它字段 * *-* D HexDigits C CONST(01234

10、56789ABCDEF) D BinDs DS D BinNum 4B 0 INZ(0) D BinChar 1 OVERLAY(BinNum:2) D HexDs DS D HexC1 1 D HexC2 1 D InChar S 1 D Pos S 5P 0 D HexPos S 5P 0 C *ENTRY PLIST C PARM InString C PARM HexString *-* * 用操作说明符来确定传递的参数长度 * *-* C CALLB CEEDOD C PARM 1 ParmNum C PARM DescType C PARM DataType C PARM Desc

11、Info1 C PARM DescInfo2 C PARM InLen C PARM *OMIT C CALLB CEEDOD C PARM 2 ParmNum C PARM DescType C PARM DataType C PARM DescInfo1 C PARM DescInfo2 C PARM HexLen C PARM *OMIT *-* * 确定处理的长度(最少为输入长度和十六进制长度一半的和) * *-* C IF InLen HexLen / 2 C EVAL InLen = HexLen / 2 C ENDIF *-* * 对输入字串的每个字符,转换为2字节的16进制表示

12、。 * * (例如5转换成F5) * *-* C EVAL HexPos = 1 C DO InLen Pos C EVAL InChar = %SUBST(InString:Pos:1) C EXSR GetHex C EVAL %SUBST(HexString:HexPos:2) = HexDs C EVAL HexPos = HexPos + 2 C ENDDO *-* * 做好后,返回调用程序。 * *-* C RETURN *=* * GetHex把InChar转换成HexDs的子程序 * * * * 用16去除,分开二个16进制数字,商为第一个数字, * * 余数为第二个数字。 *

13、 *=* C GetHex BEGSR C EVAL BinChar = InChar C BinNum DIV 16 X1 5 0 C MVR X2 5 0 *-* * 用16进制数字(加1)来取16进制字符(012CDEF)的子串。 * *-* C EVAL HexC1 = %SUBST(HexDigits:X1+1:1) C EVAL HexC2 = %SUBST(HexDigits:X2+1:1) C ENDSR 图26.服务程序CVTTOHEX的源语句 当设计这个服务程序时,用连接语言来确定接口,以便日后很容易地就能更新。图27显示了定义服务程序CVTTOHEX出口所需的连接语言。

14、STRPGMEXP SIGNATURE(CVTHEX) EXPORT SYMBOL(CVTTOHEX) ENDPGMEXP 图27.CVTTOHEX的连接程序语言的源语句 STRPGMEXP中的参数SIGNATURE指出了服务程序提供的接口。这种情况下,在连接语言标识的出口是做为接口使用,任何与CVTTOHEX连接的程序都要使用这个标识。 连接语言的EXPORT语句标识了服务程序的出口。每一个可以调用的过程,都需要有一个出口。在本例中,程序所含模块只有一个过程,因此,只需要一个EXPORT语句。 关于连接程序及标识的详细的资料,参见ILE概念。2.4.4.1建立服务程序 要建立服务程序DVTT

15、OHEX,按以下步骤进行: 1.由2.4.4节中图26中的源语句建立模块CVTTOHEX :CRTRPGMOD MODULE(MYLIB/CVTTOHEX) SRCFILE(MYLIB/QRPGLFSRC) 2.由模块CVTTOHEX和2.4.4节中图27所示的连接语言建立服务程序。CRTSRVPGM SRVPGM(MYLIB/CVTTOHEX) MODULE(*SRVPGM) EXPORT(*SRCFILE) SRCFILE(MYLIB/QSRVSRC) SRCMBR(*SRVPGM) 上面命令的最后三个参数标识了服务程序的有效出口。在这里,它依据库MYLIB文件QSRVSRC中的成员CVT

16、TOHEX里的源语句。注意在这里不需要连接目录,因为建立服务程序所需的所有模块已经在MODULE参数中指定了。 服务程序CVTTOHEX建立在库MYLIB中。可以使用语句视图来调试它,这是由CRTRPGMOD命令中DBGVIEW参数的默认值决定的,不产生连接清单。2.4.4.2连接到程序中 要完成本例,我们要建立一个“应用程序”,它由程序CVTHEXPGM与服务程序相连接组成。它把一个七个字符长的字符串两次传给CVTTOHEX,一次十六进制串长为10(也就是转换5个字符),另一次十六进制串长为14,也就是实际的长度。 注意,程序CVTHEXPGM的目的只是显示一下服务程序CVTTOHEX的用法

17、。在实际的应用中, CVTTOHEX的调用者与测试相比,有更重要的目的。另外服务程序是供多个其它程序使用的,或被某些程序多次使用;否则,也就不把它设计为服务程序。 1.由图28所示的源程序建立模块,键入:CRTRPGMOD MODULE(MYLIB/CVTHEXPGM) SRCFILE(MYLIB/QRPGLESRC) 2.建立程序,键入: CRTPGM PGM(MYLIB/CVTHEXPGM) BNDSRVPGM(MYLIB/CVTTOHEX) DETAIL(*BASIC) 当CVTHEXPGM建立后,它包括了识别与服务程序交互作用的接口信息,这与CVTTOHEX的连接语言中所反映的相同。

18、3.调用程序,键入: CALL CVTHEXPGM 在CVTTOHEX运行的过程中,系统作以下检查: 在MYLIB库中找到服务程序CVTTOHEX 在CVTHEXPGM建立时,使用的公共接口在运行时仍然有效。 如果以上任何一条没有满足,则产生错误信息。 CVTHEXPGM的输出如下所示。(输入字符串为ABC123*) Result14+ Result10+ C1C2C3F1F2 10Character Output C1C2C3F1F2F35C 14Character Output *-* * 这个程序测试服务程序CVTTOHEX。 * * * * 1.用7个字符的输入串。 * * 2.转换成

19、10个字符的16进制串(由于结果字段对整个输入串 * * 来说太小,所以仅用输入的头5个字符)。 * * 3.转换成14个字符的16进制串(由于结果字段够长,所以输入的 * * 7个字符都被转换)。 * *-* FQSYSPRT O F 80 PRINTER D ResultDS DS D Result14 1 14 D Result10 1 10 D InString S 7 D Comment S 25 C EVAL InString = ABC123* *-* * 用CALLB(D)传递字符串和10个字符的结果字段,操作扩展(D) * * 每个传递的参数生成操作说明符,这是用CVTTDH

20、EX调用的例程 * * 所必须的。 * *-* C EVAL Comment = 10 character output C CLEAR ResultDS C CALLB(D) CVTTOHEX C PARM InString C PARM Result10 C EXCEPT *-* * 用CALLB(D)传递字符串和14个字符的结果字段。 * *-* C EVAL Comment = 14 character output C CLEAR ResultDS C CALLB(D) CVTTOHEX C PARM InString C PARM Result14 C EXCEPT C EVAL

21、*INLR = *ON OQSYSPRT H 1P O Result14+ OQSYSPRT H 1P O Result10+ OQSYSPRT E O ResultDS O Comment +5 图28.测试程序CVTHEXPGM的源语句2.4.4.3更新服务程序 由于有连接语言,可以更新服务程序而不必重新编译程序CVTHEXPGM。例如,可以在CVTTOHEX中加一个新的过程。 1.为新过程建立模块目标。 2.修改连接语言源语句以处理与新过程相关联的接口。这样要在已经存在的出口语句后添加新的出口语句。 3.重新建立服务程序把新模块连接到服务程序CVTTOHEX上。新的程序可以使用新的功能。

22、因为旧的入口仍按原来的次序排列,所以仍然可以使用原有的程序。除非要改原有的程序,否则就不必重新编译它。 关于更新服务程序的详细资料,参见ILE概念。2.4.4.4样本连接清单 图29显示了CVTHEXPGM的样本连接清单,这是一个基本清单。关于连接清单的详细资料,参见2.3.3节中的“使用连接清单”和ILE概念。 Create Program Page 1 5763SS1 V3R1M0 940909 MYLIB/CVTHEXPGM AS400S01 09/22/94 23:24:00 Program . . . . . . . . . . . . . . . . . . . . . : CVT

23、HEXPGM Library . . . . . . . . . . . . . . . . . . . . : MYLIB Program entry procedure module . . . . . . . . . . : *FIRST Library . . . . . . . . . . . . . . . . . . . . : Activation group . . . . . . . . . . . . . . . . . : *NEW Creation options . . . . . . . . . . . . . . . . . : *GEN *NODUPPROC

24、*NODUPVAR *WARN *RSLVREF Listing detail . . . . . . . . . . . . . . . . . . : *BASIC Allow Update . . . . . . . . . . . . . . . . . . . : *YES User profile . . . . . . . . . . . . . . . . . . . : *USER Replace existing program . . . . . . . . . . . . . : *YES Authority . . . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Target release . . . . . . . . . . . . . . . . . . : *CURRENT Allow reinitialization . . . . . . . . . . . . . . : *NO Text . . . . . . . . . . . . . . . . . . . . . . . : *ENTMODTXT Module Library Module Library Module Library Module Library CVT

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1