Explicit use of a DLL in a COBOL/C application
The following example shows explicit use of a DLL in a COBOL/C
application.
CBL NODYNAM
IDENTIFICATION DIVISION.
PROGRAM-ID. 'COBOL1'.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 DLL-INFO.
03 DLL-LOADMOD-NAME PIC X(12).
03 DLL-PROGRAM-NAME PIC X(160).
03 DLL-PROGRAM-HANDLE POINTER.
77 DLL-RC PIC S9(9) BINARY.
77 DLL-PROGRAM-PTR PROCEDURE-POINTER.
77 DLL-STATUS PIC X(1) VALUE 'N'.
88 DLL-LOADED VALUE 'Y'.
88 DLL-NOT-LOADED VALUE 'N'.
PROCEDURE DIVISION.
IF DLL-NOT-LOADED
THEN
* Move the names in. They must be null terminated.
MOVE Z'OOC05R' TO DLL-LOADMOD-NAME
MOVE Z'ooc05r' TO DLL-PROGRAM-NAME
* Call the C routine to load the DLL and to get the
* function descriptor address.
CALL 'A1CCDLGT' USING BY REFERENCE DLL-INFO
BY REFERENCE DLL-RC
IF DLL-RC = 0
THEN
SET DLL-LOADED TO TRUE
ELSE
DISPLAY 'A1CCLDGT failed with rc = '
DLL-RC
MOVE 16 TO RETURN-CODE
STOP RUN
END-IF
END-IF
* Move the function pointer to a procedure pointer
* so that we can use the call statement to call the
* program in the DLL.
SET DLL-PROGRAM-PTR TO DLL-PROGRAM-HANDLE
* Call the program in the DLL.
CALL DLL-PROGRAM-PTR
GOBACK.
#include <stdio.h>
#include <dll.h>
#pragma linkage (A1CCDLGT,COBOL)
typedef struct dll_lm {
char dll_loadmod_name[12];
char dll_func_name[160];
void (*fptr) (void); /* function pointer */
} dll_lm;
void A1CCDLGT (dll_lm *dll, int *rc)
{
dllhandle *handle;
void (*fptr1)(void);
*rc = 0;
/* Load the DLL */
handle = dllload(dll->dll_loadmod_name);
if (handle == NULL) {
perror("A1CCDLGT failed on call to load DLL.\n");
*rc = 1;
return;
}
/* Get the address of the function */
fptr1 = (void (*)(void))
dllqueryfn(handle,dll->dll_func_name);
if (fptr1 == NULL) {
perror("A1CCDLGT failed on retrieving function.\n");
*rc = 2;
return;
}
/* Return the function pointer */
dll->fptr = fptr1;
return;
}