Get Dll functions at compile time
Johnson Jones via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Aug 9 14:32:47 PDT 2017
Was buggy due to refactoring.
----------------------------
module DLLImport;
/* Import DLL functions in to type T. The following example shows
methodology
struct DLL_gdk
{
@("DLLImport") public static extern(Windows)
{
@("libgdk-3-0.dll")
{
void* function(GdkWindow *window) gdk_win32_window_get_handle;
}
}
}
// Fixes static functions and function pointers to point to their
specified DLL's
ImportDLLs!DLL_gdk;
*/
void ImportDLLs(T)()
{
version(Windows)
{
import core.sys.windows.windows, std.conv, std.meta, std.traits;
HINSTANCE[string] DLLs;
foreach(fname; __traits(allMembers, T))
{
mixin("enum isf = isFunction!(T."~fname~");");
mixin("enum isfp = isFunctionPointer!(T."~fname~");");
mixin("enum attrs = __traits(getAttributes, T."~fname~");");
static if ((isf || isfp) && attrs.length == 2 && attrs[0] ==
"DLLImport")
{
auto dllName = attrs[1];
if (dllName !in DLLs)
DLLs[dllName] = LoadLibrary(to!wstring(dllName~"\0").ptr);
auto dll = DLLs[dllName];
if (dll == null)
assert(0, "Cannot load DLL `"~dllName~"'");
auto func = GetProcAddress(dll, fname);
mixin("import "~moduleName!(T)~";");
static if (isf)
mixin("auto p = cast(void**)&"~T.stringof~"."~fname~"; *p =
cast(typeof(p))func;");
else static if (isfp)
mixin(""~T.stringof~"."~fname~" =
cast(typeof("~T.stringof~"."~fname~"))func;");
else
static assert("DLLImport Error");
}
}
}
}
More information about the Digitalmars-d-learn
mailing list