S60 Open C
Open C Tips and Tricks

Open C Tips and Tricks

Table of Contents

How to export global data from a DLL

 


How to export global data from a DLL

Exporting global data from a DLL to be accessed by either Open C or Symbian C++ applications is one of the typical problems that developers encounter.

NOTE! 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:

  1. Do not export global variables.
  2. Export one method that returns a pointer to that variable.
  3. Define a macro for the user of the DLL.

See the example below:

1. Do not export global variables.

Within DLL, say there is one global variable, for example:

int globalVal; 

2. Export one method that returns a pointer to that variable

extern "C" EXPORT_C int* GlbData ()
    {
    return &globalVal
    }

3. Define a macro for the user of the DLL

Within the DLL header (e.g., 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;
    }

Give feedback of this section


Back to top


Copyright ©2008 Nokia Corporation. All rights reserved. This documentation can be used in the connection with this Product to help and support the user.