Search code examples
rpgle

How To Call procedure by pointer in RPGLE


I use callback in the service module. The pointer of the callback function I want to pass as procedure parameter.

How I could to call the my callback function in the service module?

psevdocode:

main code:

 dcl-pr Proc2;
   ptr pointer;      
 end-pr;

 dcl-s ptr inz(%Addr(Proc1))

 Proc2( ptr);

 dcl-proc Proc1;
 dcl-pi *n;
    parm1 char(123);
 end-pi;
   ...     
 end-proc Proc1;

Service programm

 dcl-proc Proc2;
 dcl-pi *n;
   ptr pointer;
 end-pi;

      dcl-s param char(123) inz('xxxaaaqqq') 

     *ptr( param ); // call callback

 end-proc Proc2;

Solution

  • %PADDR() (Get Procedure Address) built in function
    PROCPTR keyword (in fixed format d-specs)
    POINTER(*PROC) (in free format d-specs)

    dcl-pr Proc2;
       ptr pointer(*PROC);
    end-pr;
    
    Proc2( %paddr(Proc1));
    
    dcl-proc Proc1;
    dcl-pi *n *IND;
       parm1 char(123);
       parm2 int(10);
    end-pi;
      ...     
    end-proc Proc1;
    

    *SRVPGM

     dcl-proc Proc2;
     dcl-pi *n;
       ptr pointer(*PROC)
     end-pi;
    
     //defined prototype for callback
     // as EXTernal PROCedure pointed to by ptr
     dcl-pr callback extproc(ptr) *IND;
       cbParm  char(123);
       cbParm2 int(10);
     end-pr;
    
         dcl-s param char(123) inz('xxxaaaqqq') 
         dcl-s myInt int(10);
         dcl-s success ind;
    
         success = callback( param:myInt ); // call callback
    
     end-proc Proc2;