The TARGETTYPE
in the MMP file changes from app
to exe
. However, for applications that need to also run on the EKA1 emulator, the TARGETTYPE
must be exedll
. Hence, the following lines should replace the existing TARGET
and TARGETTYPE
lines:
#if !defined(EKA2) && defined(WINS) TARGET ExeAppTest.app TARGETTYPE exedll deffile \epoc32\release\wins\exedllapp.def #else TARGET ExeAppTest.exe TARGETTYPE exe #endif
The TARGET
filename's extension should be .exe
. It is also important is that the second UID (the application identifier) remains the same: 0x100039CE
. For EKA1 emulator builds, the binary produced is a DLL with the entry point exported at ordinal one. Therefore, as in the example above, a deffile
statement is used to define the export.
The stack size should be explicitly set to a value greater than the default of 8K. Previously, applications were launched in a process initiated by apprun.exe
which had a stack size of 20K. Therefore, to ensure the converted application will not have any problems with stack size, this is the minimum value the stack size should be set to. This is done in the MMP file with the line:
epocstacksize 0x5000
Note that embedding an EXE-app inside another EXE-app (see the Embeddable applications section below) is enough to overflow the default 8K stack.
The API for starting the application framework is in eikcore.dll
, so eikcore.lib
needs to be listed in the LIBRARY
section of the MMP file.
The EikStart::RunApplication()
function needs to be called from the EXE's entry point, passing as an argument a pointer-to-function which creates an instance of the CApaApplication
-derived class (this is the same function that is exported at ordinal 1 for DLL-apps). In EKA1 emulator builds, the command line also needs to be passed to this function. This is demonstrated by the following code, which works for all builds:
#include <eikstart.h> LOCAL_C CApaApplication* NewApplication() { return new CExampleApplication; } GLDEF_C TInt E32Main() { return EikStart::RunApplication(NewApplication); } #if defined(__WINS__) && !defined(EKA2) GLDEF_C TInt E32Dll(TDllReason) { return KErrNone; } EXPORT_C TInt WinsMain(TDesC* aCmdLine) { return EikStart::RunApplication(NewApplication, aCmdLine); } #endif
If the application needs to store configuration or application data, a private directory will need to be created. For more information on private directories, see the documentation on the RFs
class.
The relevant functions in the RFs
class for private directories are are:
RFs::PrivatePath
gets the private path for a process
RFs::CreatePrivatePath
creates the private directory for a process on the specified drive
RFs::SetSessionToPrivate
sets the session path to point to the private directory on the specified drive