A Simple DLL Wrapper
Kristian Kilpi
kjkilpi at gmail.com
Fri Feb 23 03:25:54 PST 2007
On Fri, 23 Feb 2007 08:39:57 +0200, oldrev <wstring at gmail.com> wrote:
> The better version:
>
> 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;
> extern(Windows) alias ReturnValue function(Params) FunctionType;
> }
>
> // FP_Function
> private template MixinMember(S) //S = Symbol template
> {
> 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);
> }
> }
>
>
> final 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()
> {
> auto dll = new Module!("User32.dll",
> Symbol!("MessageBoxW", int, HWND, LPCWSTR, LPCWSTR, UINT),
> Symbol!("MessageBoxA", int, HWND, LPCSTR, LPCSTR, UINT)
> );
>
> dll.MessageBoxW(null, "Hello! DLL! W", "Title W", MB_OK);
> dll.MessageBoxA(null, "Hello! DLL! A", "Title A", MB_OK);
>
> }
>
>
Very nice indeed! :)
More information about the Digitalmars-d-learn
mailing list