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


©Nokia 2007

Back to top


This material, including documentation and any related computer programs, is protected by copyright controlled by Nokia. All rights are reserved. Copying, including reproducing, storing, adapting or translating, any or all of this material requires the prior written consent of Nokia. This material also contains confidential information, which may not be disclosed to others without the prior written consent of Nokia.

Nokia is a registered trademark of Nokia Corporation. S60 and logo is a trademark of Nokia Corporation. Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. Other company and product names mentioned herein may be trademarks or tradenames of their respective owners.