The are four types of DLLs:
A) Stand-alone DLLs.
>> Sample Code: \rsxnt\sample\dll\dllso
RSXIDE
Compiler switches:
gcc -Zwin32 -Zdll -Zso -Zsys dllso.c exports.def
These DLLs contain the C library or parts thereof, which is used privately by the DLL. The main program and the other DLLs use a different C runtime environment. Keep in mind that the DLL and the program using the DLL don't share file handles or global variables. A stand-alone DLL does not need a runtime DLL like RSXNT.DLL or RSXNTCS.DLL and can be used from other applications that are not compiled with gcc and rsxnt.
B) DLLs without C runtime environment.
>> Sample Code: \rsxnt\sample\dll\dllnrt
Compiler switches:
gcc -Zwin32 -Zdll -Zno-rte dllnrt.c exports.def
These DLLs don't call any C library functions which require a runtime environment. Only Win32 API functions and simple C library functions such as strcpy() can be called. The size of the DLL is very small and the DLL doesn’t need a main program that is compiled with gcc and rsxnt.
C) DLLs which use a C runtime DLL.
>> Sample Code: \rsxnt\sample\dll\dllcrt
Compiler switches:
gcc -Zwin32 -Zdll -Zcrtdll=crtrsxnt dllcrt.c exports.def
These DLLs don't contain C library functions. Calls to C library functions are resolved by rsxntcs.dll or a custom C runtime DLL (and, in all three cases, rsxnt.dll). The main program and all DLLs must use the same C runtime DLL. File handles and global variables are shared.
D) Custom C runtime DLLs.
>> Sample Code: \rsxnt\source\crtrsxnt
These DLLs contain the C library or parts thereof and export the C library functions to other DLLs and to the main program. An application (main program and DLLs) should use only one custom C runtime DLL; emxlibcm.dll and emxlibcs.dll
Compiler switches:
gcc -Zwin32 -Zdll dllcustom.c exports.def
You must write a module definition file to define the export names. The file should have the extension .def.
Usage:
EXPORTS <entryname> [@<ordinal>]
Example:
EXPORTS MyFunc @1 Test @2
>> Sample Code: \rsxnt\sample\dll\dllrt
To access data from a DLL you must use the following code. Do not define the data with the const attribute.
DLL code:
int dll_data = 13
APP code:
extern int *dll_data /*only a pointer into import section*/ printf("%d\n", *data);
You can write a header file that redefines the symbol. The header-file CRTRSXNT.H redefines the data symbols from the C runtime DLLs.
#if !defined (__DLL__) /* redefine symbol for apps */ #define dll_data (*dll_data) #endif extern int dll_data;
DLL code:
int dll_data = 13
APP code:
printf("%d\n", data);