Example of a DLL Module Definition File

The module definition file shown here illustrates the most common statements used in a module definition file to build DLLs.

LIBRARY SAMPLE03 INITINSTANCE TERMINSTANCE

DATA NONSHARED READWRITE

EXPORTS

	nSize ; array size

	pArray ; pointer to base of array of ints

	nSwaps ; number of swaps required to sort the array

	nCompares ; number of comparisons required to sort the array

	list ; array listing function

	bubble ; bubble sort function

	insertion ; insertion sort function

Note: In this module definition file, the EXPORTS statement does not include the selection function because the source code contains a #pragma export statement for selection.

The module statements specified in the module definition file are as follows:

LIBRARY SAMPLE03 INITINSTANCE TERMINSTANCE
This statement identifies the executable file as a dynamic link library and specifies that SAMPLE03 is the name of the DLL. It also uses the following attributes to specify when the _DLL_InitTerm function will be called:
INITINSTANCE
The function is called the first time the DLL is loaded for each process that accesses the DLL. The alternative is INITGLOBAL; the function is called only the first time the DLL is loaded.

INITGLOBAL is the default.

TERMINSTANCE
The function is called the last time the DLL is freed for each process that accesses the DLL. The alternative is TERMGLOBAL; the function is called only the final time the DLL is freed.

TERMGLOBAL is the default.

NONSHARED
Specifies that the data segment cannot be shared and must be loaded separately for each process. The alternative is SHARED; one copy of the segment is loaded and shared by all processes that access the module.

Note that if you use the READONLY attribute, data segments are always shared.

Note: If the two above data segment attributes conflict, such as NONSHARED or SHARED, the behaviour is undefined.

READWRITE
Means that you can read from or write to the data segment. The alternative is READONLY; you can only read from the data segment.

READWRITE is the default.

CODE
This statement defines the default attributes for code segments within the DLL. LOADONCALL means that the code segment is loaded when it is first accessed. LOADONCALL is the default.

Note: You can also specify PRELOAD, but Version 2.0 and later of the OS/2 operating system ignore the PRELOAD attribute and use the LOADONCALL instead.

EXPORTS export
This statement defines the names of the functions and variables to be exported to other runtime modules. Following the EXPORTS keyword are the export definitions, which are simply the names of the functions and variables that you want to export. Each name must be entered on a separate line.

Note:

When you build your DLL using /Gd-, so that it is statically linked to the runtime library, you must specify the following attributes in your module definition file:



Define Code and Data Segments in a DLL


Summary of Module Definition Statements