www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Dynamic bindings to global variables

reply "remi thebault" <remi.thebault outlook.com> writes:
Hello

I wrote static bindings to a C library. I want to also offer a 
version(Dynamic) of the bindings.
I follow and use derelict-util to get the address of function 
pointers.

In the library I bind, there is also global variables. here's one 
example in the static bindings:

extern __gshared wl_interface wl_display_interface;

(wl_interface is a struct, not a pointer alias)

How would one make dynamic binding of this?
Is it possible to retrieve the address of the symbol and use 
std.conv.emplace?

thank you
Aug 02 2015
parent reply "Mike Parker" <aldacron gmail.com> writes:
On Sunday, 2 August 2015 at 15:31:48 UTC, remi thebault wrote:
 Hello

 I wrote static bindings to a C library. I want to also offer a 
 version(Dynamic) of the bindings.
 I follow and use derelict-util to get the address of function 
 pointers.

 In the library I bind, there is also global variables. here's 
 one example in the static bindings:

 extern __gshared wl_interface wl_display_interface;

 (wl_interface is a struct, not a pointer alias)

 How would one make dynamic binding of this?
 Is it possible to retrieve the address of the symbol and use 
 std.conv.emplace?
You have to declare it as a pointer, then retrieve the pointer in the same way you do the function pointers, via the system loader (GetProcAddress/dlsym).
Aug 02 2015
parent reply "remi thebault" <remi.thebault outlook.com> writes:
On Sunday, 2 August 2015 at 15:38:34 UTC, Mike Parker wrote:
 You have to declare it as a pointer, then retrieve the pointer 
 in the same way you do the function pointers, via the system 
 loader (GetProcAddress/dlsym).
and how would you make this source compatible with the static binding version? I guess it is not possible extern(C): version(Dynamic) { __gshared wl_interface *wl_display_interface; } else { extern __gshared wl_interface wl_display_interface; } // use case: some_func expects a pointer to wl_interface // the C version is using addressof operator, (as do the static D bindings) some_func(&wl_display_interface);
Aug 02 2015
parent "remi thebault" <remi.thebault outlook.com> writes:
On Sunday, 2 August 2015 at 16:20:29 UTC, remi thebault wrote:
 On Sunday, 2 August 2015 at 15:38:34 UTC, Mike Parker wrote:
 You have to declare it as a pointer, then retrieve the pointer 
 in the same way you do the function pointers, via the system 
 loader (GetProcAddress/dlsym).
and how would you make this source compatible with the static binding version? I guess it is not possible extern(C): version(Dynamic) { __gshared wl_interface *wl_display_interface; } else { extern __gshared wl_interface wl_display_interface; } // use case: some_func expects a pointer to wl_interface // the C version is using addressof operator, (as do the static D bindings) some_func(&wl_display_interface);
I'll manage this through static property-ies thanks for your help RĂ©mi
Aug 02 2015