libgmodulelibgmodule 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.
Note:
G_MODULE_BIND_LOCAL is the only flag currently supported.
The other flags are not supported. If the user specifies any other flag, the
module is loaded using the flag G_MODULE_BIND_LOCAL and not
by the user-specified flag.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.