今天晚上在牺牲了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
分享到:
相关推荐
虚拟化_一切皆有可能.pdf
相信自己,一切皆有可能参考.doc
一切皆有可能 Word表格玩序号填充.docx
(中小学教育)一切皆有可能.ppt
超级整人软件,没有做不到——————QQ群:58388451 ——————一切皆有可能!~
立志勤奋创新一切皆有可能国旗下讲话.pdf
从“花小猪”学:一切商业皆有可能.docx
以更实惠的方式获得强大的支持。 便宜,可靠,有准备! 多年来,我们的发行经历了巨大的发展。 首先,它是专门针对开发人员需求的发行版,但是多年来... 一切皆有可能! 登录! 您需要使用用户名:dev和密码:linux登录
用5分钟搭建一个独立博客网站,在云时代,一切皆有可能! 今天向大家介绍一个很优秀的框架,Hugo项目。通过Go语言开发,能够快速的生成静态博客、内容网站。通过HUGO可以几秒钟搭建一个完全属于自己的博客网站。 ...
。。。
,,,
虚拟链接 ... 但是从理论上讲,一切皆有可能! 当前,vlink支持以下对象和可执行文件格式: ELF 32bit PowerPC big endian ELF 32bit PowerPC AmigaOS (special dynamic linking rules) ELF 32bit P
通过此扩展程序,您可以将与Netflix:trade_mark:帐户关联的个人资料图片更改为所需的任何图像-从您心爱的小猫到您喜欢的一餐-一切皆有可能! 更多信息:https://koelker.dev/extensions/netflix-pp/ ***请注意:-您...
你有这么多的收集在这场比赛中,一切皆有可能! 钓鱼你的方式到顶部,并成为这场海战中的顶级球员! 管理船和钓鱼竿:左,右,下或箭头键,或A,S,D键。重置炸弹:空间 支持语言:Bahasa Indonesia,Deutsch,English,...
地狱邮报你认为的一切皆有可能
诺萨雷亚Norzarea 是一切皆有可能发生的国家
这个项目已经死了! 有了Firefox 57,一切皆有可能! 已停止工作并进行修复,则需要将所有内容扔掉并重新从头开始。 相反,我建议使用以下项目之一: (已 ) 谢谢大家的建议,感谢和帮助! —
该项目旨在制作一个用 php 和 mysql 创建的 mmorpg,利用面向对象编程的可塑性,并有利于那些想加入的人的创造力和想象力。 只要你愿意,一切皆有可能!
现在处理器的核心越来越多,它的固有问题就越来越明显。现在麻省理工的科学家们开发出全新技术,让高效的36核处理器一下子成为了可能。
21、一切皆有可能(三) 22、一切皆有可能(二) 23、一切皆有可能(一) 24、水彩画的经典之作 25、创意无极限 26、顶级移花接木PS作品(三) 27、顶级移花接木PS作品(二) 28、顶级移花接木PS作品(一) 29...