A Simple DLL Wrapper
oldrev
wstring at gmail.com
Thu Feb 22 11:18:39 PST 2007
I wrote a DLL wrapper template, but why it cannot work fine?
import std.c.windows.windows;
import std.stdio;
import std.traits;
import std.string;
import std.utf;
struct Symbol(char[] SymName, Ret, Params...)
{
alias Params Parameters;
alias Ret ReturnValue;
const char[] Name = SymName;
alias extern(Windows) ReturnValue function (Params) FunctionType;
}
private template SymbolToTypeString(S)
{
const char[] SymbolToTypeString = S.ReturnValue.stringof ~ "
function" ~
S.Parameters.stringof;
}
// FP_Function
private template MixinMember(S) //S = Symbol template
{
//mixin("public alias extern(C) " ~ SymbolToTypeString!(S) ~ " FP_"
~ S.Name ~ ";");
//mixin("public FP_" ~ S.Name ~ " " ~ S.Name ~ " = null;");
mixin("public alias S.FunctionType FP_" ~ S.Name ~ ";");
mixin("public S.FunctionType " ~ S.Name ~ ";");
}
private template MixinAllMembers(S, V...)
{
mixin MixinMember!(S);
static if(V.length > 0)
{
mixin MixinAllMembers!(V);
}
}
class Module(char[] Path, Symbols...)
{
private HMODULE m_handle = null;
public mixin MixinAllMembers!(Symbols);
public this()
{
load(Path);
initMembers();
}
public ~this()
{
free();
}
private void initMembers()
{
foreach (i, S; Symbols)
{
mixin(S.Name ~ " = getSymbol!(FP_" ~ S.Name ~ ")(S.Name);");
}
}
void load(char[] path)
{
// m_handle = LoadLibraryW(toUtf16z(path));
m_handle = LoadLibraryA(toStringz(path));
assert(m_handle);
}
void free()
{
if(m_handle != null)
{
FreeLibrary(m_handle);
m_handle = null;
}
}
public T getSymbol(T)(char[] sym)
{
return cast(T)getSymbol1(sym);
}
public void* getSymbol1(char[] sym)
{
return GetProcAddress(m_handle, toStringz(sym));
}
}
void main()
{
// int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT
uType);
// HWND GetDesktopWindow();
auto dll = new Module!("User32.dll",
Symbol!("MessageBoxW", int, HWND, LPCWSTR, LPCWSTR, UINT),
Symbol!("GetDesktopWindow", HWND));
dll.MessageBoxW(null, toUTF16z("Hello! DLL!"), null, MB_OKCANCEL);
//dll.MessageBoxW(null, toUTF16z("Hello! DLL!"), toUTF16z("fdsfas"),
MB_OKCANCEL);
HWND h = dll.GetDesktopWindow();
writefln(h);
}
More information about the Digitalmars-d-learn
mailing list