第七章建立服务程序.docx

上传人:b****7 文档编号:11413237 上传时间:2023-02-28 格式:DOCX 页数:17 大小:24.81KB
下载 相关 举报
第七章建立服务程序.docx_第1页
第1页 / 共17页
第七章建立服务程序.docx_第2页
第2页 / 共17页
第七章建立服务程序.docx_第3页
第3页 / 共17页
第七章建立服务程序.docx_第4页
第4页 / 共17页
第七章建立服务程序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第七章建立服务程序.docx

《第七章建立服务程序.docx》由会员分享,可在线阅读,更多相关《第七章建立服务程序.docx(17页珍藏版)》请在冰豆网上搜索。

第七章建立服务程序.docx

第七章建立服务程序

2.4第七章建立服务程序

本章给出下面的内容:

服务程序概念

建立服务程序的策略

CRTSRVPGM命令简介

服务程序的例子

2.4.1服务程序概述

服务程序是一个连接程序(类型为*SRVPGM),它由一系列过程组成,这些过程可以由其他连接程序中的过程调用。

服务程序是典型的公用函数,它在应用程序内和应用程序之间频繁调用。

例如,ILE编译程序使用服务程序来提供运行期间服务,象数学函数和输入/输出子例程。

使用服务程序的好处是,可重复使用,维护简单,减少存储空间。

服务程序与程序的区别,表现在两个方面:

它不包括程序入口过程。

这意味着不能用CALL操作调用服务程序。

服务程序通过引用,连接到其它程序或服务程序中。

当把服务程序连接到程序时,服务程序的内容并没有拷贝到程序中,而是服务程序的连接信息被连接到程序中。

和连接模块到程序中的静态连接相对应,这种连接叫做“引用连接”。

因为服务程序是通过引用连接到程序上,所以可以使用CALLB操作调用服务程序的出口过程。

由于是通过引用连接,所以调用有一定数量的开销,但是,随后对它的过程的任何调用都比程序调用快。

服务程序中的一系列出口是,它所提供的服务的接口。

可以使用显示服务程序CDSPSRVPGM命令或服务程序清单,来查看哪些变量用于过程调用。

2.4.2建立服务程序的策略

当建立服务程序时,应当注意:

1.是否希望以后更新该程序。

2.是否某些更新会引起接口的改变(即使用的进口和出口)。

如果服务程序的接口改变了,那么就必须重新连接那些与原服务程序连接的程序。

如果所做的修改是向上兼容的,并且是用连接语言建立的服务程序,那么也许可以减少重新连接的数量。

在这种情况下,当更新连接语言源程序,来标识新的出口后,只需重新连接那些使用他们的程序。

连接语言让你控制服务程序的出口,当你要做以下的事情时这种控制是很有用的:

给服务程序用户包装某些服务程序产品

改正问题

增强功能

减小因为修改对应用程序用户造成的影响

关于使用连接语言建立服务程序的例子,参见2.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)

连接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修改服务程序

可以用程序目标相同方法更新或修改服务程序。

也就是说,你可以:

更新服务程序(使用UPDSRVPGM)

修改优化级(使用CHGSRVPGM)

删除可视性(使用CHGSRVPGM)

缩减尺寸(使用CPROBJ)

关于以上几点的详细资料,参见2.3.4节中的“修改模块或程序”。

2.4.3.2相关的CL命令

以下的CL命令也可以对服务程序使用:

修改服务程序(CHGSRVPGM)

显示服务程序(DSPSRVPGM)

删除服务程序(DLTSRVPGM)

更新服务程序(UPDSRVPGM)

处理服务程序(WRKSRVPGM)

2.4.4样本服务程序

以下的例子显示了如何建立服务程序CNTTOHEX,该程序把字符串转换为与之等价的十六进制形式。

有两个参数需要传递给服务程序:

1.要转换的字符型字段(Instring)

2.包含两个字节的十六进制数的字符型字段(Hexstring)

Hexstring字段用来存储转换结果,并且也表示要转换的字符串的长度。

例如,如果被传递的是30个字符长的字符串,但是你只想转换前10个,那么你只需传递20个字节长(2乘10)的串作为第二个参数。

根据所传递的字段的长度,服务程序决定要处理的长度。

图26给出了服务程序的源语句。

服务程序中过程的基本逻辑如下所示:

1.使用操作描述来确定传递参数的长度。

2.确定要转换的长度:

该长度值是字符串长度的最小值或16进制字段的二分之一。

3.使用子例程GetHex把字符串中的每个字符转换成与之相等价的两字节十六进制值。

4.过程返回到调用者。

该服务程序使用了操作描述,它是ILE的构成部分,当事先不知道所传递的参数的确切属性时使用它,在本例中是长度。

当在CALLB操作上指定了操作扩展符(D),那么在调用过程时就建立操作描述。

要使用操作描述,服务程序必须调用ILE的可连接API,CEEDOD(接收操作描述)。

这个API要求必须定义CALLB操作的某些参数。

但它是提供所需信息的最后一个参数,即长度。

关于操作描述的详细信息,参见2.6.3.3节中的“使用操作描述”。

*=================================================================*

*CVTTOHEX—把输入串转换成十六进制的输出串。

*

**

*注:

必须传递操作说明符。

*

**

*=================================================================*

*-----------------------------------------------------------------*

*程序参数:

*

*1.输入:

字符串(N)*

*2.输入:

十六进制(2n)*

*-----------------------------------------------------------------*

DInStringS16383

DHexStringS32766

*-----------------------------------------------------------------*

*CEEDOD的二进制参数(从操作说明符得来)*

*-----------------------------------------------------------------*

DParmNumS9B0

DDescTypeS9B0

DDataTypeS9B0

DDescInfo1S9B0

DDescInfo2S9B0

DInLenS9B0

DHexLenS9B0

*-----------------------------------------------------------------*

*程序所用的其它字段*

*-----------------------------------------------------------------*

DHexDigitsCCONST('0123456789ABCDEF')

DBinDsDS

DBinNum4B0INZ(0)

DBinChar1OVERLAY(BinNum:

2)

DHexDsDS

DHexC11

DHexC21

DInCharS1

DPosS5P0

DHexPosS5P0

C*ENTRYPLIST

CPARMInString

CPARMHexString

*-----------------------------------------------------------------*

*用操作说明符来确定传递的参数长度*

*-----------------------------------------------------------------*

CCALLB'CEEDOD'

CPARM1ParmNum

CPARMDescType

CPARMDataType

CPARMDescInfo1

CPARMDescInfo2

CPARMInLen

CPARM*OMIT

CCALLB'CEEDOD'

CPARM2ParmNum

CPARMDescType

CPARMDataType

CPARMDescInfo1

CPARMDescInfo2

CPARMHexLen

CPARM*OMIT

*-----------------------------------------------------------------*

*确定处理的长度(最少为输入长度和十六进制长度一半的和)*

*-----------------------------------------------------------------*

CIFInLen>HexLen/2

CEVALInLen=HexLen/2

CENDIF

*-----------------------------------------------------------------*

*对输入字串的每个字符,转换为2字节的16进制表示。

*

*(例如’5’转换成’F5’)*

*-----------------------------------------------------------------*

CEVALHexPos=1

CDOInLenPos

CEVALInChar=%SUBST(InString:

Pos:

1)

CEXSRGetHex

CEVAL%SUBST(HexString:

HexPos:

2)=HexDs

CEVALHexPos=HexPos+2

CENDDO

*-----------------------------------------------------------------*

*做好后,返回调用程序。

*

*-----------------------------------------------------------------*

CRETURN

*=================================================================*

*GetHex—把InChar转换成HexDs的子程序*

**

*用16去除,分开二个16进制数字,商为第一个数字,*

*余数为第二个数字。

*

*=================================================================*

CGetHexBEGSR

CEVALBinChar=InChar

CBinNumDIV16X150

CMVRX250

*-----------------------------------------------------------------*

*用16进制数字(加1)来取16进制字符(012…CDEF)的子串。

*

*-----------------------------------------------------------------*

CEVALHexC1=%SUBST(HexDigits:

X1+1:

1)

CEVALHexC2=%SUBST(HexDigits:

X2+1:

1)

CENDSR

图26.服务程序CVTTOHEX的源语句

 

当设计这个服务程序时,用连接语言来确定接口,以便日后很容易地就能更新。

图27显示了定义服务程序CVTTOHEX出口所需的连接语言。

STRPGMEXPSIGNATURE(CVTHEX)

EXPORTSYMBOL('CVTTOHEX')

ENDPGMEXP

图27.CVTTOHEX的连接程序语言的源语句

 

STRPGMEXP中的参数SIGNATURE指出了服务程序提供的接口。

这种情况下,在连接语言标识的出口是做为接口使用,任何与CVTTOHEX连接的程序都要使用这个标识。

连接语言的EXPORT语句标识了服务程序的出口。

每一个可以调用的过程,都需要有一个出口。

在本例中,程序所含模块只有一个过程,因此,只需要一个EXPORT语句。

关于连接程序及标识的详细的资料,参见ILE概念。

2.4.4.1建立服务程序

要建立服务程序DVTTOHEX,按以下步骤进行:

1.由2.4.4节中图26中的源语句建立模块CVTTOHEX:

CRTRPGMODMODULE(MYLIB/CVTTOHEX)SRCFILE(MYLIB/QRPGLFSRC)

2.由模块CVTTOHEX和2.4.4节中图27所示的连接语言建立服务程序。

CRTSRVPGMSRVPGM(MYLIB/CVTTOHEX)MODULE(*SRVPGM)

EXPORT(*SRCFILE)SRCFILE(MYLIB/QSRVSRC)

SRCMBR(*SRVPGM)

上面命令的最后三个参数标识了服务程序的有效出口。

在这里,它依据库MYLIB文件QSRVSRC中的成员CVTTOHEX里的源语句。

注意在这里不需要连接目录,因为建立服务程序所需的所有模块已经在MODULE参数中指定了。

服务程序CVTTOHEX建立在库MYLIB中。

可以使用语句视图来调试它,这是由CRTRPGMOD命令中DBGVIEW参数的默认值决定的,不产生连接清单。

2.4.4.2连接到程序中

要完成本例,我们要建立一个“应用程序”,它由程序CVTHEXPGM与服务程序相连接组成。

它把一个七个字符长的字符串两次传给CVTTOHEX,一次十六进制串长为10(也就是转换5个字符),另一次十六进制串长为14,也就是实际的长度。

注意,程序CVTHEXPGM的目的只是显示一下服务程序CVTTOHEX的用法。

在实际的应用中,CVTTOHEX的调用者与测试相比,有更重要的目的。

另外服务程序是供多个其它程序使用的,或被某些程序多次使用;否则,也就不把它设计为服务程序。

1.由图28所示的源程序建立模块,键入:

CRTRPGMODMODULE(MYLIB/CVTHEXPGM)SRCFILE(MYLIB/QRPGLESRC)

2.建立程序,键入:

CRTPGMPGM(MYLIB/CVTHEXPGM)

BNDSRVPGM(MYLIB/CVTTOHEX)

DETAIL(*BASIC)

当CVTHEXPGM建立后,它包括了识别与服务程序交互作用的接口信息,这与CVTTOHEX的连接语言中所反映的相同。

3.调用程序,键入:

CALLCVTHEXPGM

在CVTTOHEX运行的过程中,系统作以下检查:

在MYLIB库中找到服务程序CVTTOHEX

在CVTHEXPGM建立时,使用的公共接口在运行时仍然有效。

如果以上任何一条没有满足,则产生错误信息。

CVTHEXPGM的输出如下所示。

(输入字符串为’ABC123*’)

Result14++++++

Result10++

C1C2C3F1F210CharacterOutput

C1C2C3F1F2F35C14CharacterOutput

*----------------------------------------------------------------*

*这个程序测试服务程序CVTTOHEX。

*

**

*1.用7个字符的输入串。

*

*2.转换成10个字符的16进制串(由于结果字段对整个输入串*

*来说太小,所以仅用输入的头5个字符)。

*

*3.转换成14个字符的16进制串(由于结果字段够长,所以输入的*

*7个字符都被转换)。

*

*----------------------------------------------------------------*

FQSYSPRTOF80PRINTER

DResultDSDS

DResult14114

DResult10110

DInStringS7

DCommentS25

CEVALInString='ABC123*'

*----------------------------------------------------------------*

*用CALLB(D)传递字符串和10个字符的结果字段,操作扩展(D)*

*每个传递的参数生成操作说明符,这是用CVTTDHEX调用的例程*

*所必须的。

*

*----------------------------------------------------------------*

CEVALComment='10characteroutput'

CCLEARResultDS

CCALLB(D)'CVTTOHEX'

CPARMInString

CPARMResult10

CEXCEPT

*----------------------------------------------------------------*

*用CALLB(D)传递字符串和14个字符的结果字段。

*

*----------------------------------------------------------------*

CEVALComment='14characteroutput'

CCLEARResultDS

CCALLB(D)'CVTTOHEX'

CPARMInString

CPARMResult14

CEXCEPT

CEVAL*INLR=*ON

OQSYSPRTH1P

O'Result14++++++'

OQSYSPRTH1P

O'Result10++'

OQSYSPRTE

OResultDS

OComment+5

图28.测试程序CVTHEXPGM的源语句

2.4.4.3更新服务程序

由于有连接语言,可以更新服务程序而不必重新编译程序CVTHEXPGM。

例如,可以在CVTTOHEX中加一个新的过程。

1.为新过程建立模块目标。

2.修改连接语言源语句以处理与新过程相关联的接口。

这样要在已经存在的出口语句后添加新的出口语句。

3.重新建立服务程序把新模块连接到服务程序CVTTOHEX上。

新的程序可以使用新的功能。

因为旧的入口仍按原来的次序排列,所以仍然可以使用原有的程序。

除非要改原有的程序,否则就不必重新编译它。

关于更新服务程序的详细资料,参见ILE概念。

2.4.4.4样本连接清单

图29显示了CVTHEXPGM的样本连接清单,这是一个基本清单。

关于连接清单的详细资料,参见2.3.3节中的“使用连接清单”和ILE概念。

CreateProgramPage1

5763SS1V3R1M0940909MYLIB/CVTHEXPGMAS400S0109/22/9423:

24:

00

Program.....................:

CVTHEXPGM

Library....................:

MYLIB

Programentryproceduremodule..........:

*FIRST

Library....................:

Activationgroup.................:

*NEW

Creationoptions.................:

*GEN*NODUPPROC*NODUPVAR*WARN*RSLVREF

Listingdetail..................:

*BASIC

AllowUpdate...................:

*YES

Userprofile...................:

*USER

Replaceexistingprogram.............:

*YES

Authority....................:

*LIBCRTAUT

Targetrelease..................:

*CURRENT

Allowreinitialization..............:

*NO

Text.......................:

*ENTMODTXT

ModuleLibraryModuleLibraryModuleLibraryModuleLibrary

CVT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

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

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