On Friday, 9 February 2018 at 12:15:04 UTC, Dennis wrote:


I presume the .dll isn't loaded properly (if at all), but I can't find a load function in the .lib and don't know how to debug this. So I guess I'll just do it manually since that works, but does anyone have some tips to make .dll bindings elegantly?

I suggest you read this first:

http://derelictorg.github.io/bindings/

It explains the difference between dynamic bindings and static bindings. The important thing to understand is that both types can be used with DLLs, but only static bindings can be use with static libraries.

Dynamic bindings have no link time dependency on the DLL and the DLL must be loaded manually. Static bindings have a link time dependency and can be linked with either a static library, an import library (on Windows -- what you get when you run implib or compile a DLL yourself), or directly with a shared object (.so) on non-Windows systems (and probably .dylib/Frameworks on Mac).

Dynamic bindings use function pointer because that's the only way to do manuall loading. For static bindings, you use normal function declarations and the OS will load the DLL automatically when the app starts up (dynamic loading) if you've linked to an import library or .so, and, of course, will load nothing if you've linked to a static library.

Some Derelict packages, like DerelictSDL2 and DerelictGLFW3, support both dynamic and static binding. For the former, the function pointer declarations and the loader are all in [1]. For the latter, there is no loader and the declarations are all in [2].

[1] https://github.com/DerelictOrg/DerelictGLFW3/blob/master/source/derelict/glfw3/dynload.d

[2] https://github.com/DerelictOrg/DerelictGLFW3/blob/master/source/derelict/glfw3/statfun.d

So if you don't need to load manually and don't mind the link-time dependency on the C library, then you can use normal function declarations in your binding:

extern(C) @nogc nothrow {
    void foo();
}

Reply via email to