|
|
|
The simplest use of a resource file involves reading string resources.
Resources are defined in terms of structs. In general, structs need
to be defined, assuming that pre-defined structs are not being used. In the
following code fragments, a struct of type STRING is defined that
has a single member of type LTEXT.
The resource file can contain just the following text:
// define structures
STRUCT STRING
{
LTEXT text;
}
// define resources
RESOURCE STRING hello
{
text=Bonjour tout le monde!;
}From this, the resource compiler generates two files:
the .rsc file containing the resource data; this is
the resource file that must be referred to at run-time by the
RResourceFile class in the C++ code.
the .rsg file is a generated
header file that contains #define statements for
each resource defined in the source file. In the resource file generated here,
the only resource is called hello and the generated header file
contains:
#define HELLO 1
Note that the name in the generated header file is converted to upper case.
The file containing the C++ code must #include the
.rsg file in order to have access to the resource ids generated by
the resource compiler. For example, for a project called ReadText,
this might be:
#include ReadText.rsgThe C++ program initialises the RResourceFile object,
specifying the filename of the resource file:
RResourceFile resourceFile;
resourceFile.OpenL(fsSession,_L(Z:\\system\\data\\ReadText.rsc));Because the resource file contains an RFile, it must use a
session to the file server for its operations - this is the
fsSession parameter to OpenL().
RResourceFile::AllocReadLC() is one of three functions
that can be used to read a resource. It allocates a heap descriptor of
sufficient length to contain the resource, reads in the binary data for the
resource and pushes the heap descriptor’s address onto the cleanup
stack. If a leave occurs while this heap descriptor is still on the cleanup
stack, it is automatically popped off the cleanup stack and destroyed.
HBufC8* dataBuffer = resourceFile.AllocReadLC(HELLO);The HELLO symbol is #defined to 1 by the
statement in the #included .rsg file. This statement
therefore reads resource number 1 from the .rsc file.
The resource data must be interpreted using a
TResourceReader object. This provides access to the text string
through a pointer descriptor, as the following code fragment shows:
TResourceReader theReader;
...
theReader.SetBuffer(datafBuffer);
TPtrC textdata = reader.ReadTPtrC();In this example, once the resource data is no longer needed, the heap
descriptor, dataBuffer, can be popped off the cleanup stack and
destroyed:
CleanupStack::PopAndDestroy();When all operations on the resource file are complete, the resource file can be closed:
resourceFile.Close();Another example: consider a resource constructed from the following definition.
RESOURCE ARRAY anarray
{
items=
{
LBUF { txt="Esc"; },
LBUF { txt="Enter"; },
LBUF { txt="Tab"; },
LBUF { txt="Del"; },
LBUF { txt="Space"; }
};
}A TPtrC representing the second item can be constructed using the ReadTPtrC() function. The example simply takes the length of the text Enter:
// open the resource file
...
HBufC8* res = resourceFile.AllocReadLC(ANARRAY);
TResourceReader theReader;
...
TInt len;
len = (theReader.ReadTPtrC(1,res)).Length(); // len == 5
...