Ibm midrange 从CL程序调用GRTOBJAUT时,参数OBJ被切断

Ibm midrange 从CL程序调用GRTOBJAUT时,参数OBJ被切断,ibm-midrange,Ibm Midrange,我制作了一个CL程序来简化更改对象的所有者、USRPRF和权限。它利用GRTOBJAUT等来进行更改。以下是参数定义: pgm parm(&libobj &type &owner &usrprfown &user1 &auth1 + &user2 &auth2 &user3 &auth3) ... dcl

我制作了一个CL程序来简化更改对象的所有者、USRPRF和权限。它利用GRTOBJAUT等来进行更改。以下是参数定义:

         pgm        parm(&libobj &type &owner &usrprfown &user1 &auth1 +
                      &user2 &auth2 &user3 &auth3)
         ...
         dcl        var(&libobj) type(*char) len(21)
         dcl        var(&type) type(*char) len(10)
         dcl        var(&user1) type(*char) len(10)
         dcl        var(&auth1) type(*char) len(10)
         ...
这就是我如何称呼GRTOBJAUT的:

         grtobjaut  obj(&libobj) objtype(*all) user(&user1) +
                         aut(&auth1)
但是,实际上只有
&libobj
的前10个字符被传递给grtobaut。我已经在调试器中验证了传递例如MYLIB/TEST1234会导致
grtobaut obj('MYLIB/TEST')
,尽管
&libobj
包含完整字符串。根据语法,这应该是GRTOBJAUT命令的正确语法,因此允许超过10个字符的长路径。事实并非如此吗?交互式GRTOBJAUT和CL GRTOBJAUT之间有区别吗?我该怎么做

该程序针对v6.1进行编译,并在支持v7.1的环境中运行


编辑:同样的问题也适用于CHGOBJOWN。

不能在单个参数中同时传递库名和对象名。GRTOBJAUT OBJ()参数有两部分,而不是一部分。您只定义一个部分,并声明其长度为21个字符。但事实并非如此。它由两部分组成,每部分有十个字符长

一般来说,您应该通过以下方式更改您的CL:

 pgm        parm(&lib &obj &type &owner &usrprfown &user1 &auth1 +
              &user2 &auth2 &user3 &auth3)
 ...
 dcl        var(&lib) type(*char) len(10)
 dcl        var(&obj) type(*char) len(10)
库名称和对象名称作为单独的10个字符的名称传入。然后GRTOBJAUT命令将如下所示:

 grtobjaut  obj(&lib/&obj) objtype(*all) user(&user1) +
                 aut(&auth1)
请注意,OBJ()参数分别指定这两个部分

如果您愿意,您可以保留21个字符的CL parm。但是,如果您这样做了,您将不得不在CL中添加代码来解析parm值,并在将库和对象名传递到GRTOBJAUT之前提取它们。只需将它们分别传递到您的CL中就更简单了

一旦将它们分开,您就需要确保&lib在GRTOBJAUT收到时不是空的。如果它以空白值的形式进入CL,则需要指定一个特殊值,如“*LIBL”、“*CURLIB”或任何合适的值,以便GRTOBJAUT可以处理它

还有其他选择,但在尝试本质上是“技巧”的东西之前,您应该了解这一要求。

从技术上讲,带引号的字符串(使用双引号)可以传递到GRTOBJAUT中。但是,这样的字符串将是(1)库的名称,或(2)对象的名称。不管它是哪个名称,字符串值的长度必须小于等于10个字符。如果同时需要库和名称,则它们是由“/”分隔符分隔的两个单独的值。