程序控制
本节描述如何访问和使用当前正在执行的程序以外的程序。 程序控制使用 IccProgram 类,这是其中一个资源类。 可以使用 IccProgram 对象来装入,卸载和链接程序。 可以查询 IccProgram 对象以获取有关程序的信息。
有关 IccProgram 类的详细参考信息,请参阅 IccProgram 类。
程序控制示例
此处显示的示例显示了一个程序依次调用另外两个程序,数据通过 COMMAREA 在它们之间传递。 一个程序假定为本地程序,另一个程序在远程 CICS® 系统上。 这些程序位于两个文件中: ICC$PRG1 和 ICC$PRG2。 请参阅 C++ 样本程序 ,以获取这些文件的位置以及这些样本程序的预期输出。 这些样本中的大多数终端 IO 已从下面的代码中省略。
如 图 1中所示,这两个程序的代码首先包含基础类的头文件和 main 方法的存根。 用户代码位于每个程序 IccUserControl run方法中。
#include "icceh.hpp"
#include "iccmain.hpp"
void IccUserControl::run()
{如图 2 所示,第一个程序 ( ICC$PRG1 ) 创建一个代表远程区域的 IccSysId 对象,以及两个代表将从该程序调用的本地和远程程序的 IccProgram 对象。 还会创建 100 字节的固定长度缓冲区对象,以用作程序之间的通信区域。
IccSysId sysId( "ICC2" );
IccProgram icc$prg2( "ICC$PRG2" );
IccProgram remoteProg( "ICC$PRG3" );
IccBuf commArea( 100, IccBuf::fixed );如 图 3所示,然后程序尝试装入并查询程序 ICC$PRG2的属性。
icc$prg2.load();
if (icc$prg2.condition() == IccCondition::NORMAL)
{
term->sendLine( "Loaded program: %s <%s> Length=%ld Address=%x",
icc$prg2.name(),
icc$prg2.conditionText(),
icc$prg2.length(),
icc$prg2.address() );
icc$prg2.unload();
}如 图 4中所示,通信区缓冲区设置为包含要传递到 ICC$PRG1 链接到的第一个程序 (ICC$PRG2) 的一些数据。 运行 ICC$PRG2 时,将暂挂 ICC$PRG1 。图 4: 程序 ICC$PRG1: 使用通信区缓冲区
commArea = "DATA SET BY ICC$PRG1";
icc$prg2.link( &commArea );被调用程序 ICC$PRG2是一个简单程序,其主旨如 图 5所示。 ICC$PRG2 获取对传递给它的通信区域的访问权。 然后,它会修改此通信区域中的数据,并将控制权传回给调用它的程序。图 5。 程序 ICC$PRG2: 使用通信区缓冲区
IccBuf& commArea = IccControl::commArea();
commArea = "DATA RETURNED BY ICC$PRG2";
return;第一个程序 (ICC$PRG1) 现在在另一个系统上调用另一个程序,如 图 6中所示。 setRouteOption将调用此对象的数据路由到远程系统。 再次设置通信区域 (因为它将由 ICC$PRG2更改) ,然后链接到远程程序 (系统 ICC2上的ICC$PRG3 )。图 6。 程序 ICC$PRG1 调用远程程序
remoteProg.setRouteOption( sysId );
commArea = "DATA SET BY ICC$PRG1";
remoteProg.link( &commArea );调用的程序使用 CICS 临时存储器,但此处讨论的三行显示在 图 7中。 同样,远程程序 (ICC$PRG3) 可以访问传递给它的通信区域。 它修改此通信区域中的数据,并将控制传递回调用它的程序。图 7。 远程程序使用临时存储器
IccBuf& commArea = IccControl::commArea();
commArea = "DATA RETURNED BY ICC$PRG3";
return;最后,调用程序本身结束并将控制权返回给 CICS。
return;
};