|
Archives
D Programming
digitalmars.Ddigitalmars.D.bugs digitalmars.D.dtl digitalmars.D.ide digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger D.gnu D C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript electronics |
digitalmars.D.learn - A Simple DLL Wrapper
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);
}
Feb 22 2007
You're example template/mixin complies and runs fine with dmd v1.007 under WinXP SP2...I see the Messagebox message and the handle ID number in the console area for the main windows' desktop. Tis pretty Kool what you've done! Good work. :) So what's problem you're seeing? David L. ------------------------------------------------------------------- "Dare to reach for the Stars...Dare to Dream, Build, and Achieve!" ------------------------------------------------------------------- MKoD: http://spottedtiger.tripod.com/D_Language/D_Main_XP.html Feb 22 2007
David L. Davis wrote:You're example template/mixin complies and runs fine with dmd v1.007 under WinXP SP2...I see the Messagebox message and the handle ID number in the console area for the main windows' desktop. Tis pretty Kool what you've done! Good work. :) So what's problem you're seeing? Feb 22 2007
Content-Type: text/plain
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);
}
Feb 22 2007
oldrev wrote: Feb 22 2007
Content-Type: text/plain kris Wrote:oldrev wrote:The better version: import std.c.windows.windows; import std.stdio; import std.traits; import std.string; ...... Feb 23 2007
On Fri, 23 Feb 2007 08:39:57 +0200, oldrev <wstring gmail.com> wrote: Feb 23 2007
oldrev wrote: <snip> Feb 23 2007
|