57 lines
1.4 KiB
Vala
57 lines
1.4 KiB
Vala
class MyModule : TypeModule
|
|
{
|
|
[CCode (has_target = false)]
|
|
private delegate Type PluginInitFunc(TypeModule module);
|
|
|
|
private GLib.Module module = null;
|
|
|
|
private string name = null;
|
|
|
|
public MyModule(string name)
|
|
{
|
|
this.name = name;
|
|
}
|
|
|
|
public override bool load()
|
|
{
|
|
string path = Module.build_path(null, name);
|
|
module = Module.open(path, GLib.ModuleFlags.BIND_LAZY);
|
|
if(null == module) {
|
|
error("Module not found");
|
|
}
|
|
|
|
void * plugin_init = null;
|
|
if(! module.symbol("plugin_init", out plugin_init)) {
|
|
error("No such symbol");
|
|
}
|
|
|
|
((PluginInitFunc) plugin_init)(this);
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void unload()
|
|
{
|
|
module = null;
|
|
|
|
message("Library unloaded");
|
|
}
|
|
}
|
|
|
|
// Never unref instance of GTypeModule
|
|
// http://www.lanedo.com/~mitch/module-system-talk-guadec-2006/Module-System-Talk-Guadec-2006.pdf
|
|
static TypeModule module = null;
|
|
|
|
int main()
|
|
{
|
|
module = new MyModule("plugin");
|
|
module.load();
|
|
|
|
var o = GLib.Object.new(Type.from_name("MyClass"));
|
|
|
|
// free last instance, plugin unload
|
|
o = null;
|
|
|
|
return 0;
|
|
}
|