Created On:  04 January 2012

Problem:

The following compiler directive has to be set in order to enable the C$Century call (or some other RM/COBOL subroutine like C$DevEnv,...) to return a value:

RM "GIVING"

But if this compiler directive is used, the Visual COBOL subroutines don't work. For example, the CBL_GET_PROGRAM_INFO subroutine doesn't work; when I use it in a program, it doesn't work correctly or it returns a RTS error 114 on the call.

When the compiler directive RM "GIVING" is not used, then the CBL_GET_PROGRAM_INFO subroutine works correctly.

I need to use RM/COBOL subroutines and Visual Cobol subroutines in the same program. How can this be done?

Resolution:

The RM"GIVING" directive changes the default call-convention that is used from Visual COBOL to RM.

In order to call Visual COBOL subroutines in a program that has the RM"GIVING" directive on you need to specify a call-convention of 0 when calling the Visual COBOL subroutines.

Example:


      $SET RM"GIVING"
       program-id. testProgram.
       special-names.
          call-convention 0 is VisualCOBOLcall.
       data division.
       working-storage section.
       01 wsfunction             pic x(4) comp-5.
       01 param-block.
          05 cblte-gpi-size      pic x(4) comp-5.
          05 cblte-gpi-flags     pic x(4) comp-5.
          05 cblte-gpi-handle    usage pointer.
          05 cblte-gpi-prog-id   usage pointer.
          05 cblte-gpi-attrs     pic x(4) comp-5.
       01 return-buf             pic x(100).
       01 return-buf-len         pic x(4) comp-5 value 100.
       01 status-code            pic x(4) comp-5 value 0.
       01 wsname                 pic x(10) value "PATH".
       01 wsvalue                pic x(1024) value spaces.
       01 wsreturn               pic 9(9) binary.
       procedure division.

           CALL "C$GetEnv" USING wsname, wsvalue wsreturn
           display wsvalue
                     
           move length of param-block to cblte-gpi-size
           move length of return-buf to return-buf-len
           move 3 to cblte-gpi-flags
           
         *> Establish the current program and return handle           
           
           move 0 to wsfunction
           perform 100-call-program-info
           display "program name = " return-buf
           
         *> Get first entry point in program
           move 4 to wsfunction
           perform 100-call-program-info
           display "entry point = " return-buf
         
         *> Close the handle that was established
           
           move 6 to wsfunction
           perform 100-call-program-info
           stop run.
       
       100-call-program-info.
                 
           call VisualCOBOLcall "CBL_GET_PROGRAM_INFO"
              using
                 by value wsfunction
                 by reference   param-block
                 by reference   return-buf
                 by reference   return-buf-len
             returning      status-code
            end-call.