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

Parameter OBJ is cut off in call to GRTOBJAUT from CL program

我制作了一个 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 个字符传递给 GRTOBJAUT。我已经在调试器中验证传递 MYLIB/TEST1234 导致 grtobjaut obj('MYLIB/TEST'),尽管 &libobj 包含完整的字符串。根据 documentation 这应该是 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 参数。但是,如果这样做,您将必须向 CL 添加代码以解析该参数值并提取库和对象名称,然后再将它们传递到 GRTOBJAUT。将它们分别传递到您的 CL 中更简单。

将它们分开后,您需要确保 &lib 在 GRTOBJAUT 收到它时不为空。如果它作为空白值进入您的 CL,您需要分配一个特殊值,例如“*LIBL”、“*CURLIB”或任何合适的值,以便 GRTOBJAUT 可以处理它。

有其他选择,但在尝试本质上 'tricks'.

的事情之前,您应该了解此要求