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.