第七章建立服务程序Word文档格式.docx
《第七章建立服务程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《第七章建立服务程序Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
增强功能
减小因为修改对应用程序用户造成的影响
关于使用连接语言建立服务程序的例子,参见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
CPARM2ParmNum
CPARMHexLen
*确定处理的长度(最少为输入长度和十六进制长度一半的和)*
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:
CEVALHexC2=%SUBST(HexDigits:
X2+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)'
CPARMResult10
CEXCEPT
*用CALLB(D)传递字符串和14个字符的结果字段。
14characteroutput'
CPARMResult14
CEVAL*INLR=*ON
OQSYSPRTH1P
O'
Result14++++++'
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
Activationgroup.................:
*NEW
Creationoptions.................:
*GEN*NODUPPROC*NODUPVAR*WARN*RSLVREF
Listingdetail..................:
*BASIC
AllowUpdate...................:
*YES
Userprofile...................:
*USER
Replaceexistingprogram.............:
Authority....................:
*LIBCRTAUT
Targetrelease..................:
*CURRENT
Allowreinitialization..............:
*NO
Text.......................:
*ENTMODTXT
ModuleLibraryModuleLibraryModuleLibraryModuleLibrary
CVT