EGL 프로그램에서 C 함수 호출

스테레오타입이 nativeLibrary인 라이브러리 파트를 통해 EGL 프로그램에서 C 함수를 호출할 수 있습니다. 아래 지시를 따르기 전에, EGL 라이브러리를 통해 C 함수 호출에서 식별된 대로 C 코드를 컴파일하고 링크해야 합니다.

EGL 프로그램에서 C 함수를 호출하려면 다음을 수행하십시오.
  1. function invocation 명령문을 사용하여 다음을 지정하십시오.
    • C 함수의 이름
    • C 함수에 전달할 인수
    • EGL 프로그램에 리턴할 변수
  2. 함수 정의가 포함된 스테레오타입 nativeLibrary의 EGL 라이브러리 파트를 작성하십시오.
  3. USE 명령문으로 호출 모듈에서 EGL 원시 라이브러리를 지정하십시오.

예를 들어, 다음 함수 호출 명령문에서는 C 함수 sendmsg( )를 호출합니다.

sendmsg(chartype, 4, msg_status, return_code);

이는 두 개의 인수(각각 chartype4)를 함수에 전달하고 두 개의 인수가 다시 전달되도록 예상합니다(각각 msg_statusreturn_code ). 이는 다음과 같이 원시 라이브러리에서 함수를 정의하여 명확히 합니다.

Library I4GLFunctions type nativeLibrary
			{callingConvention = I4GL, dllName = "mydll"}
			Function sendmsg(chartype char(10) in, i int in, 
                       msg_status int out, return_code int out)
			endend

전달된 인수는 "in" 매개변수를 통해 지정되고 리턴될 인수는 "out" 매개변수를 통해 지정됩니다.

callingConvention
인수 스택 메커니즘을 통해 인수가 함수 및 호출 코드 간에 전달됨을 지정합니다.
dllName
이 함수가 있는 C 공유 라이브러리를 지정합니다. 라이브러리가 환경 변수 "java.library.path"에 지정된 경로에 있어야 합니다.
참고: 또한 C 공유 라이브러리 이름이 vgj.defaultI4GLNativeLibrary 시스템 특성을 통해 지정될 수 있습니다. dllName 및 시스템 특성이 둘 다 지정된 경우 dllName이 사용됩니다.

C 함수는 인수 스택에 푸시된 값의 수를 지정하는 정수 인수를 수신합니다(이 경우 두 개의 인수). 이는 C 함수의 스택에서 가져올 값의 수입니다. 또한 함수는 제어를 EGL 프로그램에 다시 전달하기 전에 msg_statusreturn_code 인수의 값을 리턴해야 합니다.

C 함수는 스택에 저장된 값의 올바른 개수가 전달되었다고 가정하지 않습니다. C 함수는 이에 대해 스택에 저장된 EGL 인수의 수를 확인하는 데 해당 정수 인수를 테스트해야 합니다.

이 예제에서는 정확히 하나의 인수가 필요한 C 함수를 보여줍니다.

int nxt_bus_day(int nargs);
{
    int theDate;
    if (nargs != 1)
    {
       fprintf(stderr,
          "nxt_bus_day: wrong number of parms (%d)\n",
          nargs );
       ibm_lib4gl_returnDate(0L);
       return(1);
    }
    ibm_lib4gl_popDate(&theDate);
    switch(rdayofweek(theDate))
    {
    case 5: /* change friday -> monday */
          ++theDate;
    case 6: /* saturday -> monday*/
          ++theDate;
    default: /* (sun..thur) go to next day */
          ++theDate;
    }
    ibm_lib4gl_returnDate(theDate); /* stack result */
    return(1) /* return count of stacked */
 }
 

함수는 지정된 날짜 이후 다음 영업일의 날짜를 리턴합니다. 함수가 정확히 하나의 인수를 수신해야 하므로 함수가 전달된 인수의 개수를 확인합니다. 함수가 다른 개수의 인수를 수신하면 프로그램을 종료합니다(식별 메시지 포함).