Introduction to libgmodule

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.

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.