Rational Developer for System z
PL/I for Windows, Version 8.0, Programming Guide

Invoking non-PL/I routines from a PL/I MAIN

If your main routine is programed in PL/I, you can call two kinds of non-PL/I routines:

System routines do not require their own runtime environment, and they can be linked directly into a PL/I executable (.EXE) file or dynamic link library (.DLL). With the exception of IBM VisualAge C/C++ routines, all other non-PL/I routines should not be linked directly into an .EXE or .DLL. They should be linked instead into a .DLL so that any run-time environment initialization that they require can be performed when that .DLL is loaded.

IBM VisualAge C/C++ routines can be linked with PL/I. However, if C routines are linked with PL/I and any of them use C library functions (or are C library functions themselves), the C runtime must be initialized before any routines are called. The C runtime can be initialized by calling the following routine

 dcl _CRT_init  ext('_CRT_init')
                entry()
                returns( optional fixed bin(31) )
                options( linkage(optlink) );

Also, in order to ensure that the C runtime closes all files it opened and returns any other system resources it may have acquired, you have to terminate the C runtime by calling

 dcl _CRT_term  ext('_CRT_term')
                entry()
                returns( optional fixed bin(31) )
                options( linkage(optlink) );
Rational Developer for System z
PL/I for Windows, Version 8.0, Programming Guide