/TITLE GETSPGMPTR Get Service Program Pointer *--------------------------------------------------------------* *‚ Programmers Group & Management Resources Copyright 2002 €* * * * \\\\\\\ * * ( o o ) * *---------------------oOOO----(_)----OOOo----------------------* * * * System name. . :‚ IT €* * Service Program:‚ GETSPGMPTR €* * Text . . . . . :‚ Get Service Program Pointer €* * Author . . . . :‚ Alex Nubla €* * * * OOOOO OOOOO * * ( ) ( ) * *--------------------( )-------------( )-------------------* * (_) (_) * * * * Description. . : The idea behind this is to allow dynamic * * procedure (service program) call from * * the calling program. What this procedure * * does is activate the bound *SRVPGMs * * at execution time and set all the function* * pointers after determining what *SRVPGMs * * to activate. * * * * Create the module first. Then CRTSRVPGM. * * * * CRTSRVPGM SRVPGM(GETSPGMPTR) * * MODULE(GETSPGMPTR) * * EXPORT(*ALL) * * BNDSRVPGM(*LIBL/QC2UTIL1) * * * *--------------------------------------------------------------* * * * Modification Log : * * * * Req * *„Date „Number„Programmer/Description €* * 11/28/01 Alex Nubla * * Creation Date * * * *--------------------------------------------------------------* /EJECT H NOMAIN H COPYRIGHT('(C) Alex Nubla of PGMR, Inc. 2002') H DATEDIT(*DMY) H DEBUG OPTION(*SRCSTMT:*NODEBUGIO) **************************************************************** *‚ D E F I N I T I O N S P E C I F I C A T I O N €* **************************************************************** *--------------------------------------------------------------* * * Get Service Program Pointer * D GetSPgmPtr PR * ProcPtr D SrvPgm 10A Const D Library 10A Const D Procedure 100A Const Varying D Pointer S * ProcPtr D Based(frog) **************************************************************** *‚ G E T S P G M P T R P R O T O T Y P E €* **************************************************************** *==============================================================* * * * Get Service Program Pointer Prototype * * * P GetSPgmPtr B Export *==============================================================* D GetSPgmPtr PI * ProcPtr D SrvPgm 10A Const D Library 10A Const D Procedure 100A Const Varying *--------------------------------------------------------------* * * Resolve system pointer (calls RSLVSP.H) * D RslvSp PR * ProcPtr ExtProc('rslvsp') D ObjectType 2A Value D ObjectName 31A D ObjectLib 31A D Req_Auth 2A Value D Type_Lib C x'0401' D Type_SrvPgm C x'0203' D Auth_Obj_Ctrl C x'8000' D Auth_Obj_Mgmt C x'4000' D Auth_Pointer C x'2000' D Auth_Space C x'1000' D Auth_Retrieve C x'0800' D Auth_Insert C x'0400' D Auth_Delete C x'0200' D Auth_Update C x'0100' D Auth_Owner C x'0080' D Auth_Excluded C x'0040' D Auth_Lst_Mgmt C x'0020' D Auth_Execute C x'0010' D Auth_Alter C x'0008' D Auth_Ref C x'0004' D Auth_All C x'FF1C' D Auth_None C x'0000' *--------------------------------------------------------------* * * Activate Bound Program (service program QLEAWI) * D ActBndPgm PR 10I 0 ExtProc('QleActBndPgm') D SrvPgmPtr * Value D ActMark 10I 0 Options(*Omit) D ActInfo Like(Act_Info) Options(*Omit) D ActInfoLen 10I 0 Options(*Omit) D ErrorCode Like(@ErrData) Options(*Omit) * * Format of Activation Information (ActInfo) * * *-------------------------------------------------------------* * |‚Offset €| | | * |-----+-----| | | * |‚Dec€|‚Key€|‚Type€ |‚Field€ | * |-----+-----+-----------+-------------------------------------| * | 0 | 0 | Binary(4) | Bytes returned | * |-----+-----+-----------+-------------------------------------| * | 4 | 4 | Binary(4) | Bytes available | * |-----+-----+-----------+-------------------------------------| * | 8 | 8 | Char(8) | Reserved | * |-----+-----+-----------+-------------------------------------| * | 16 | 10 | Binary(4) | Activation group mark | * |-----+-----+-----------+-------------------------------------| * | 20 | 14 | Binary(4) | Activation mark | * |-----+-----+-----------+-------------------------------------| * | 24 | 18 | Char(7) | Reserved | * |-----+-----+-----------+-------------------------------------| * | 31 | 1F | Char(1) | Flags | * |-----+-----+-----------+-------------------------------------| * | 32 | 20 | Char(16) | Reserved | * *-------------------------------------------------------------* * D Act_Info ds D Act_Ret 9B 0 Inz(%size(Act_Info)) D Act_Avail 9B 0 D Act_Resrvd1 8A Inz(*Allx'00') D Act_ActGrp 9B 0 D Act_ActMark 9B 0 D Act_Resrvd2 7A Inz(*Allx'00') D Act_Flags 1A D Act_Resrvd3 1A Inz(*Allx'00') *--------------------------------------------------------------* * * Get Export (service program QLEAWI) * D GetExport PR * ProcPtr ExtProc('QleGetExp') D SrvPgmMark Like(ActMark) D ExportId 10I 0 Const D ExportNamLen 10I 0 Const Options(*Omit) D ExportName 30A Const Options(*Omit) D ExportPtr * ProcPtr Options(*Omit) D ExportType 10I 0 Options(*Omit) D ErrorCode Like(@ErrData) Options(*Omit) * * Type of export item (ExportType) * D Export_Gone C 0 D Export_Proc C 1 D Export_Data C 2 D Export_No_Acc C 3 D@ErrData DS D @BytesProv 9B 0 Inz(200) D @BytesAval 9B 0 D @ExcpId 7 D @Reserved1 1 D @ExcpData 184 *--------------------------------------------------------------* * * Standalone fields * D SrvPgmPtr S Like(Pointer) D ActMark S 10I 0 D ProcPtr S * ProcPtr D ExportType S 10I 0 D ExportNbr S 10I 0 Inz(1) D ObjectType S 2A Inz(Type_SrvPgm) D ObjectName S 31A D ObjectLib S 31A C/EJECT C **************************************************************** *‚ C A L C U L A T I O N S P E C I F I C A T I O N €* **************************************************************** * *----------------------------------------------------* * Include stop codes (*Null) at end of names * *----------------------------------------------------* C Eval ObjectName = %Trimr(SrvPgm) + x'00' C Eval ObjectLib = %Trimr(Library)+ x'00' * *----------------------------------------------------* * Get the pointer of the service program * *----------------------------------------------------* C Eval SrvPgmPtr = RslvSp(ObjectType: ObjectName: C ObjectLib: Auth_None) *----------------------------------------------------* * Activate the service program * *----------------------------------------------------* C Eval ActMark = ActBndPgm(%addr(SrvPgmPtr): C *Omit: *Omit: C *Omit: *Omit) *----------------------------------------------------* * Get the Procedure Pointer for Procedure Name * *----------------------------------------------------* C Eval ProcPtr = GetExport(ActMark: 1: C *Omit: *Omit: *Omit: C *Omit: *Omit) *----------------------------------------------------* * Return the procedure pointer * *----------------------------------------------------* C Return ProcPtr P GetSPgmPtr E