A Simple DLL Wrapper
    oldrev 
    wstring at gmail.com
       
    Thu Feb 22 22:39:57 PST 2007
    
    
  
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);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lib.d
Type: application/octet-stream
Size: 2054 bytes
Desc: not available
Url : http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20070223/fb73299a/attachment.obj 
    
    
More information about the Digitalmars-d-learn
mailing list