Is there a way to do 2-way linking?
Jeroen Bollen
jbinero at gmail.com
Wed Feb 5 09:40:41 PST 2014
On Wednesday, 5 February 2014 at 17:39:34 UTC, Benjamin Thaut
wrote:
> Am 05.02.2014 18:33, schrieb Jeroen Bollen:
>> On Wednesday, 5 February 2014 at 16:27:10 UTC, Benjamin Thaut
>> wrote:
>>> Am 05.02.2014 16:36, schrieb Jeroen Bollen:
>>>> On Wednesday, 5 February 2014 at 13:52:10 UTC, Benjamin
>>>> Thaut wrote:
>>>>> Am 05.02.2014 14:21, schrieb Jeroen Bollen:
>>>>>> Is it possible to load in a dynamic library in D, and have
>>>>>> the library
>>>>>> you just loaded call your own functions? Imagine having a
>>>>>> plugin
>>>>>> loader
>>>>>> and the plugins call methods like 'addButton()' from the
>>>>>> host
>>>>>> application.
>>>>>
>>>>> Yes, thats what core.runtime.loadLibrary is for.
>>>>> http://dlang.org/phobos/core_runtime.html#.Runtime.loadLibrary
>>>>>
>>>>> You can also always fall back to operating system functions
>>>>> like,
>>>>> LoadLibrary and GetProcAddress for windows.
>>>>>
>>>>> Kind Regards
>>>>> Benjamin Thaut
>>>>
>>>> How exactly does that work 2 ways? Can I just define the
>>>> functions and
>>>> not implement them in the library?
>>>
>>> You don't define functions, just function pointers. You could
>>> also do
>>> it oop style:
>>>
>>> // The loader
>>> import core.sys.windows.windows;
>>>
>>> interface IPlugin
>>> {
>>> void pluginMethod1();
>>> void pluginMethod2();
>>> }
>>>
>>> // function pointer definition for the entry function
>>> extern(C) alias IPlugin function() pluginEntry;
>>>
>>> IPlugin loadPlugin(const(char)[] path)
>>> {
>>> auto handle = cast(HMODULE)runtime.loadLibrary(path);
>>> //use dlsym on linux
>>> auto entry = cast(pluginEntry)GetProcAddress(handle,
>>> "pluginEntry".ptr);
>>> return entry(); // get the plugin interface
>>> }
>>>
>>>
>>> // The plugin
>>> interface IPlugin
>>> {
>>> void pluginMethod1();
>>> void pluginMethod2();
>>> }
>>>
>>> class PluginImpl : IPlugin
>>> {
>>> override void pluginMethod1() { ... }
>>> override void pluginMethod2() { ... }
>>> }
>>>
>>> export extern(C) IPlugin pluginEntry()
>>> {
>>> return new PluginImpl();
>>> }
>>>
>>> This however will have issues on windows, because the runtime
>>> is not
>>> shared. On Linux it should work just fine if you remember to
>>> link
>>> against the shared runtime.
>>>
>>> You might also want to watch this talk from D-conf 2013:
>>> http://dconf.org/2013/talks/nowak.html
>>>
>>> Kind Regards
>>> Benjamin Thaut
>>
>> That example seems to only let the loader call the plugin, and
>> not the
>> other way around.
>
> Well as I already said, for the other way around just pass
> function-pointers / interfaces to the plugin as soon as you
> established the one-way connection.
Ah so like an initialize function taking a set of arguments
representing functions and classes?
More information about the Digitalmars-d
mailing list