六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 80|回复: 0

一切皆有可能!

[复制链接]

升级  63.33%

43

主题

43

主题

43

主题

秀才

Rank: 2

积分
145
 楼主| 发表于 2013-2-7 03:50:24 | 显示全部楼层 |阅读模式
今天晚上在牺牲了N^N个脑细胞之后,终于实现了上一帖所设想的DLL包装类(把Proc换成Symbol),源程序已经通过了编译,可以运行,当然还不够强壮。大半夜的趁着这股热乎劲,贴上来玩玩。


  1 import std.c.windows.windows;
  2 import std.stdio;
  3 import std.traits;
  4 import std.string;
  5 import std.utf;
  6
  7 struct Symbol(char[] SymName, Ret, Params...)
  8 {
  9     alias Params        Parameters;
10     alias Ret           ReturnValue;
11     const char[] Name = SymName;
12     extern(Windows) alias ReturnValue function(Params) FunctionType;
13 }
14
15 // FP_Function
16 private template MixinMember(S) //S = Symbol template
17 {
18     mixin("public alias S.FunctionType FP_" ~ S.Name ~ ";");
19     mixin("public S.FunctionType " ~ S.Name ~ ";");
20 }
21
22
23 private template MixinAllMembers(S, V...)
24 {
25     mixin MixinMember!(S);
26     static if(V.length > 0)
27     {
28         mixin MixinAllMembers!(V);
29     }
30 }
31
32
33 class Module(char[] Path, Symbols...)
34 {
35     private HMODULE m_handle = null;
36
37     public mixin MixinAllMembers!(Symbols);
38
39     public this()
40     {
41         load(Path);
42         initMembers();
43     }
44
45     public ~this()
46     {
47         free();
48     }
49
50     private void initMembers()
51     {
52         foreach (i, S; Symbols)
53         {
54             mixin(S.Name ~ " = getSymbol!(FP_" ~ S.Name ~ ")(S.Name);");
55         }
56     }
57
58     void load(char[] path)
59     {
60
61 //       m_handle = LoadLibraryW(toUtf16z(path));
62         m_handle = LoadLibraryA(toStringz(path));
63        assert(m_handle);
64     }
65
66     void free()
67     {
68         if(m_handle != null)
69         {
70             FreeLibrary(m_handle);
71             m_handle = null;
72         }
73     }
74
75     public T getSymbol(T)(char[] sym)
76     {
77         return cast(T)getSymbol1(sym);
78     }
79
80     public void* getSymbol1(char[] sym)
81     {
82         return GetProcAddress(m_handle, toStringz(sym));
83     }
84
85 }
86
87
88 void main()
89 {
90
91     auto dll = new Module!("User32.dll",
92             Symbol!("MessageBoxW", int, HWND, LPCWSTR, LPCWSTR, UINT),
93             Symbol!("MessageBoxA", int, HWND, LPCSTR, LPCSTR, UINT)
94             );
95
96     dll.MessageBoxW(null, "Hello! DLL! W", "Title W", MB_OK);
97     dll.MessageBoxA(null, "Hello! DLL! A", "Title A", MB_OK);
98
99 }
100



注意:需要 DMD 1.005+ 编译。
BTW: 这个语法着色是用Vim搞的,很顺眼。

如需要原始源程序请与我联系:wstring#**.@.**#gmail.com
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表