示例: 使用注册设施 API
这些 ILE C 程序显示如何注册出口点,如何将出口程序添加到出口点,以及如何根据检索到的出口点信息调用出口程序。
此示例不包含正在调用的任何程序,也不显示除调用程序的摘录以外的任何内容。
注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。
首先要做的是,在决定要放置出口点的程序对象之后,要注册该出口点。 还需要记住的是,出口点格式定义了出口程序数据的外观。 此 ILE C 程序注册名为 QIBM_QXIC_TSTXPOINTA 的出口点。
/********************************************************************/
/* PROGRAM: RegisterPoint */
/* */
/* LANGUAGE: ILE C */
/* */
/* DESCRIPTION: This program registers an exit point in an */
/* application. */
/* */
/* APIs USED: QusRegisterExitPoint */
/* */
/********************************************************************/
#include <string.h>
#include <qusec.h>
#include <qusrgfa1.h>
/********************************************************************/
/* Structure for the control block */
/********************************************************************/
typedef _Packed struct Control_x{
int Num_Vlen_Recs;
Qus_Vlen_Rec_4_t Vlen_Rec_1;
char Description[50];
} Control_Rec;
int main () {
Qus_EC_t Error_Code = {0};
char EPnt_Name[20] = "QIBM_QXIC_TSTXPOINTA";
char EPnt_F_Name[8] = "USUSOOOO";
int EProg_Number = -1;
Control_Rec EPnt_Controls = {0};
/*****************************************
*** INITIALIZING ALL STRUCTURES:: ***
*****************************************/
Error_Code.Bytes_Provided = sizeof(Error_Code);
EPnt_Controls.Num_Vlen_Recs = 1;
EPnt_Controls.Vlen_Rec_1.Length_Vlen_Record = 62;
EPnt_Controls.Vlen_Rec_1.Control_Key = 8;
EPnt_Controls.Vlen_Rec_1.Length_Data = 50;
memcpy( EPnt_Controls.Description , "Example Exit Point" , 17 );
QusRegisterExitPoint (EPnt_Name,
EPnt_F_Name,
&EPnt_Controls,
&Error_Code);
if ( Error_Code.Bytes_Available ) {
printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
exit (1);
}
return(0);
}
在注册出口点之后,必须将出口程序添加到该点,以指示基于运行时条件的可能调用。 以下 ILE C 程序将名为 TSTXITPROGQGPL 的出口程序添加到先前示例中注册的 QIBM_QXIC_TSTXPOINTA 出口点。
/********************************************************************/
/* PROGRAM: AddProgram */
/* */
/* LANGUAGE: ILE C */
/* */
/* DESCRIPTION: This program adds an exit program to a registered */
/* exit point. */
/* */
/* APIs USED: QusAddExitProgram */
/* */
/********************************************************************/
#include <qusec.h>
#include <qusrgfa1.h>
/********************************************************************/
/* Structure for the Exit Program Attributes */
/********************************************************************/
typedef _Packed struct Xit_Att{
int Num_Vlen_Recs;
Qus_Vlen_Rec_4_t ADPG_Vlen;
int CCSID;
char Reserved;
} Xit_Attributes;
int main () {
Qus_EC_t Error_Code = {0};
char EPnt_Name[20] = "QIBM_QXIC_TSTXPOINTA";
char EPnt_F_Name[8] = "USUSOOOO";
int EProg_Number = -1;
char Q_EProg_Name[20] = "TSTXITPROGQGPL ";
char EProg_Data[10] = "EXAMPLE ";
int Len_EProg_Data = sizeof(EProg_Data);
Xit_Attributes EProg_Attributes;
Error_Code.Bytes_Provided=sizeof(Error_Code);
EProg_Attributes.Num_Vlen_Recs=1;
EProg_Attributes.ADPG_Vlen.Length_Vlen_Record=16;
EProg_Attributes.ADPG_Vlen.Control_Key=3;
EProg_Attributes.ADPG_Vlen.Length_Data=4;
EProg_Attributes.CCSID = 37;
QusAddExitProgram (EPnt_Name,
EPnt_F_Name,
EProg_Number,
Q_EProg_Name,
EProg_Data,
Len_EProg_Data,
&EProg_Attributes,
&Error_Code);
if ( Error_Code.Bytes_Available ) {
printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
exit (1);
}
return(0);
}
当您已注册出口点并将出口程序添加到该出口点时,可以从应用程序中执行出口程序调用。 从 "检索出口信息" API 获取执行调用所需的信息。 在以下样本中,将根据出口点信息进行条件调用。
/********************************************************************/
/* PROGRAM: RetrieveAndProcess */
/* */
/* LANGUAGE: ILE C */
/* */
/* DESCRIPTION: This is an excerpt of a program that retrieves */
/* information on an exit point, and does processing */
/* based on that information. */
/* */
/* APIs USED: QusRetrieveExitInformation */
/* */
/********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <qusec.h>
#include <qusrgfa2.h>
/********************************************************************/
/* Structure for Selection Criteria on the Retrieve */
/********************************************************************/
typedef _Packed struct RTVEI_Select_C_x {
Qus_Selcrtr_t Crit;
Qus_Select_Entry_t Select_Entry;
char RTV_String[10];
} RTVEI_Select_C;
/********************************************************************/
/* Conv_Lib converts the library name to a null terminated string */
/********************************************************************/
char * Conv_Lib(char in_lib[], char *tmp) {
int x = 0;
while ( (in_lib[x] != ' ') && x!=10 ) {
*tmp=in_lib[x++];
tmp++;
}
return(tmp);
}
int main() {
Qus_EXTI0200_t *EXTI0200;
Qus_EXTI0200_Entry_t *EXTI0200_Entry;
char *Pgm_Data;
Qus_EC_t Error_Code= {0};
char EPnt_Name[20] = "QIBM_QXIC_TSTXPOINTA";
char EPnt_F_Name[8] = "USUSOOOO";
int EProg_Number = -1;
int Counter;
char *tmp_str;
char *lib;
char Handle[16] = " ";
int Length_Of_R_Var;
char RTVEI_Format_Name[8];
RTVEI_Select_C EProg_Select_C = {0};
/*****************************************
* Initializing Structures *
*****************************************/
Error_Code.Bytes_Provided = sizeof(Error_Code);
tmp_str=(char *)malloc(sizeof(char));
lib=(char *)malloc(sizeof(char));
EXTI0200=(Qus_EXTI0200_t *) malloc ( ( sizeof( Qus_EXTI0200_t ) +
sizeof( Qus_EXTI0200_Entry_t ) + MAX_PGM_DATA_SIZE ) * 2 );
EProg_Select_C.Crit.Number_Sel_Criteria = 1;
EProg_Select_C.Select_Entry.Size_Entry = 26;
EProg_Select_C.Select_Entry.Comp_Operator = 1;
EProg_Select_C.Select_Entry.Start_Pgm_Data = 0;
EProg_Select_C.Select_Entry.Length_Comp_Data = 10;
memcpy( EProg_Select_C.RTV_String , "EXAMPLE " , 10 );
Length_Of_R_Var = (sizeof( Qus_EXTI0200_t ) +
sizeof( Qus_EXTI0200_Entry_t ) +
MAX_PGM_DATA_SIZE) *2;
memcpy( RTVEI_Format_Name , "EXTI0200" , 8 );
QusRetrieveExitInformation (Handle,
EXTI0200,
Length_Of_R_Var,
RTVEI_Format_Name,
EPnt_Name,
EPnt_F_Name,
EProg_Number,
&EProg_Select_C,
&Error_Code);
if ( Error_Code.Bytes_Available ) {
printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
exit (1);
}
/********************************************************
* Call all of the preprocessing exit programs returned *
********************************************************/
Counter=EXTI0200->Number_Programs_Returned;
while ( Counter-- ) {
EXTI0200_Entry = (Qus_EXTI0200_Entry_t *) EXTI0200;
EXTI0200_Entry = (Qus_EXTI0200_Entry_t *)((char *)EXTI0200 +
EXTI0200->Offset_Program_Entry);
Pgm_Data = (char *) EXTI0200_Entry;
Pgm_Data += EXTI0200_Entry->Offset_Exit_Data;
Conv_Lib(EXTI0200_Entry->Program_Library,lib);
sprintf( tmp_str , "CALL %s/%.10s %.*s" ,
lib,
EXTI0200_Entry->Program_Name,
EXTI0200_Entry->Length_Exit_Data,
Pgm_Data );
system( tmp_str );
/********************************************************
* This is where Error Handling on the exit program *
* would be done. *
********************************************************/
if ( Counter ) {
memcpy(EXTI0200->Continue_Handle,Handle,16);
QusRetrieveExitInformation(Handle,
EXTI0200,
Length_Of_R_Var,
RTVEI_Format_Name,
EPnt_Name,
EPnt_F_Name,
EProg_Number,
&EProg_Select_C,
&Error_Code);
if ( Error_Code.Bytes_Available ) {
printf("\nEXCEPTION : %s",Error_Code.Exception_Id);
exit (1);
}
}
}
return(0);
}