CRTPGM和UPDPGM之间的区别是什么



假设我的模块发生了一些更改,所以我不得不更新服务程序,结果签名发生了更改。那么我不应该选择哪一种呢?我应该使用CRTPGM或UPDPGM来重新创建使用服务程序的程序吗。在这种情况下,你能说出CRTPGM和UPDPGM之间的区别吗。

首先,您不应该仅仅因为*SRVPGM发生了更改就需要CRTPGM或UPDPGM。由于*SRVPGM的更改,要求*PGM重新编译应该是一个非常罕见且非常有意的决定。

听起来你可能在使用CRTSRVPGM EXPORT(*ALL),不要这么做。相反,使用绑定源CRTSRVPGM EXPORT(*SRCFILE) SRCFILE(..)来控制导出的过程和服务程序签名。硬编码签名的简单方法

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
ENDPGMEXP

现在,您可以将过程添加到服务程序中,只要将导出添加到末尾,就可以保持相同的签名,而不会强制重新编译使用该服务程序的任何程序。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
export symbol('Proc3')
export symbol('Proc4')
ENDPGMEXP

在这种情况下,您不能删除或重新排序导出。

如果您确实需要确保所有调用程序的重新编译,那么只需更新硬编码签名即可。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v2')
export symbol('Proc1')
export symbol('Proc3')
export symbol('Proc4')
ENDPGMEXP

另一种选择是让系统生成签名,并使用*CURRENT*PRV块。但是,在不中断现有调用程序的情况下,您仍然无法删除或重新排序导出。因此,社区的共识是简单地对签名进行硬编码。IBM自己在操作系统中包含*SRVPGM对象时也遵循这种做法。

要认识到的两件重要的事情是

  • 过程签名(参数的数量和类型(与*SRVPGM签名无关
  • 过程名称被解析为"0";绑定";*PGM对象的时间,在执行过程中,调用实际上是按位置进行的

例如,如果我有这个

dcl-pr Proc1 extproc(*dclcase);
parm1 char(10);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
parm1 char(20);
end-pr;

具有粘合剂源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
ENDPGMEXP

我能做这个

dcl-pr Proc1 extproc(*dclcase);
parm1 char(10);
parm2 char(20) option(*nopass);
end-pr;
dcl-pr Proc2_depreciated extproc(*dclcase);
parm1 char(20);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
parm1 varchar(100) const;
end-pr;

具有粘合剂源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2_deprecated')
export symbol('Proc2')
export symbol('Proc3')
ENDPGMEXP

现有的*PGM调用Proc2()将继续调用现在重命名为Proc2_deprecated()的代码。调用Proc2()的新的或重新编译的现有*PGM将调用名为Proc2()的新添加的代码。

现在为您的问题提供一个不完整的答案,

CRTPGM和UPDPGM之间有什么区别?

我很确定存在差异,我知道当使用UPDSRVPGM而不是CRTSRVPGM时,*SRVPGM对象中的一些元数据不会更新。我敢打赌乌干达人民国防军也是如此。此外,CRTPGM有一个参数
Allow *SRVPGM library update . . ALWLIBUPD,默认为*NO,因此如果您更新的服务程序在另一个库中,则可能必须使用CRTPGM。

老实说,在平台上的30年里,我从未使用过UPDPGM或UPDSRVGM。大多数时候,我的*PGM是单个模块,使用绑定目录来查找*SRVPGM,因此通过CRTBNDRPG重新创建就足够简单了*SRVPGM要么是单个模块,要么具有特定于其创建的唯一绑定目录。

我在职业生涯中使用的变更管理工具也重新创建了对象,而不是使用UPDPGM或UPDSRVGM。

最后,如果你是ILE和*SRVPGM的Scott Klement的ILE Concepts(针对不耐烦的RPG程序员(演示是一个老掉牙但很好的东西。

相关内容

  • 没有找到相关文章

最新更新