Exporting global data from a DLL to be accessed by either P.I.P.S. or Symbian C++ applications is one of the typical problems that developers encounter.
It is strongly recommended to avoid having global data in DLLs due to following reasons:
EKA2 emulator allows only a DLL with WSD to load into a single process.
RAM usage for WSD data chunk is atleast one 4K RAM page (the smallest possible RAM allocation), irrespective of how much static data is required.
Chunks are a finite resource on ARMv5. Every process loading WSD enabled DLLs uses a chunk to hold the data.
There are ARM architecture 4 and 5 specific costs and limitations that apply only to DLLs that link against “fixed processes”.
There is a limit on the number of DLLs in a process with WSD.
On having understood the above limitations, the following pattern can be used for exporting global data from a DLL:
Do not export global variables. Within DLL, say there is one global variable, for example:
int globalVal;
Export one method that returns a pointer to that variable.
extern "C" EXPORT_C int* GlbData () { return &globalVal }
Define a macro for the
user of the DLL. Within the DLL header (for example, xxx.h
),
define the following:
#ifdef __cplusplus extern "C" #endif IMPORT_C int* GlbData (); #define globalVal (*GlbData())
And the usage is like:
#include <xxx.h> // DLL header int main() { int i = 0; globalVal = 10; globalVal++; i = globalVal; return 0; }