libgmodule has APIs that provide a portable method for dynamically loading 'plug-ins' or, in other words, DLLs. Any program that wants to dynamically load modules must be linked to libgmodule .
In order to use the libgmodule APIs, the user must check whether dynamic loading of DLLs is supported by the platform by using the g_module_supported() API which returns TRUE if the dynamic loading of modules is supported. P.I.P.S. provides the implementation of libdl , where dynamic loading of modules is supported, but to write code which runs across platforms the user must do a check before using the libgmodule APIs.
If the dynamic loading of DLLs is supported, use g_module_open() to open the module. It takes the name of the module as the first argument and the flags as the second argument.
GModule * g_module_open(const gchar *file_name, GModuleFlags flags);
file_name : The name of the file containing the module.
flags : The flags used for opening the module.
Once the module is opened, the user can find the module symbols (for example,. function names) using the function
g_module_symbol() .
gboolean g_module_symbol (GModule *module, const gchar *symbol_name, gpointer *symbol);
*module : This is a pointer returned when a module is opened using g_module_open() .
symbol_name : This is the ordinal number of the symbol that one wants to open. There is a difference between Symbian GLib and OSS GLib; as in Linux the symbol_name is the name of the symbol and not a number. The ordinal number must be passed as a string and not a number.
symbol : This is the pointer to the symbol value
The GModule can be closed by using the g_module_close() API. This API returns TRUE if it successfully closed the module; else it returns FALSE.
gboolean g_module_close(GModule *module);
*module The GModule to close.
The following example code explains the usage of the libgmodule APIs. It opens a module libmoduletestplugin_a.dll and uses its gplugin_a_func1() API which is ordinal number 1. Finally, the module is closed.
#include <gmodule.h>
#include <glib.h>
typedef int (*SimpleFunc) (void);
int main()
{
GModule *module = NULL;
gpointer func;
SimpleFunc f_a;
int retVal;
if (!g_module_supported())
{
g_print ("Dynamic Opening of modules is not supported");
return 1;
}
/* G_MODULE_BIND_LAZY is overridden and the module is opened with
* flag G_MODULE_BIND_LOCAL
*/
module = g_module_open("libmoduletestplugin_a.dll",G_MODULE_BIND_LAZY);
// 1 is the ordinal number for gplugin_a_func1
if(module && g_module_symbol(module, "1" ,&func))
{
f_a = (SimpleFunc)func;
retVal = f_a();
g_print("Function at ordinal number 1 of module libgmodule_a returns %d",retVal);
}
else
{
g_print("Error quering symbol at ordinal number 1");
return 1;
}
return 0;
}
See the Libgmodule APIs section in Differences between OSS and Symbian GLib for more details about libgmodule limitations in the Symbian GLib implementation.
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.