`
oldrev
  • 浏览: 233381 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

一切皆有可能!

阅读更多
今天晚上在牺牲了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

分享到:
评论

相关推荐

    引用队文化完善管理思索.doc

    1. **激励学习信心和热情**:通过专题教育和随机教育,如设定明确目标、培养积极心态等,让“相信自己,一切皆有可能!”的理念深入人心,鼓励每个成员树立信心,培养积极的学习态度。同时,通过个性化的目标设定、...

    新标准英语六年级下M7U2PPT课件.pptx

    课件通过这些人物的故事鼓励学生,强调了“一切皆有可能!永不放弃!你能成功!”的理念,旨在激发学生的积极态度和坚韧精神,让他们认识到只要有决心,就能克服生活中的困难。 总的来说,这个专业课件通过生动的...

    相信自己,一切皆有可能参考.doc

    相信自己,一切皆有可能参考.doc

    中考激励语大全.pdf

    3. "拼搏进取,一切皆有可能!我们的梦想一定能实现!":这句话传达了积极进取的精神,让学生相信通过努力,实现自己的目标并非遥不可及。 4. "决战高考,改变命运。屡挫屡战,笑傲群雄":尽管中考与高考略有不同,...

    整人软件(pretty boy)

    超级整人软件,没有做不到——————QQ群:58388451 ——————一切皆有可能!~

    新人教统编版四年级上册道德与法治 第9课 正确认识广告 第1课时 教学课件.ppt

    广告的目的不仅是宣传商品,还常常采用吸引人的广告语来吸引消费者的注意力,例如“一切皆有可能!”(李宁体育用品)、“爱你等于爱自己”(娃哈哈纯净水)等。这些广告语不仅易于记忆,还能深入人心,塑造品牌形象...

    随机签名(刷新一下页面就变一次) .net源程序_aspx开发教程.rar

    ", "一切皆有可能!" }; Random random = new Random(); int index = random.Next(signatures.Length); string randomSignature = signatures[index]; ``` 其次,我们需要将这个随机生成的签名嵌入到ASPX页面中。在...

    立志勤奋创新一切皆有可能国旗下讲话.pdf

    《立志勤奋创新,一切皆有可能》的国旗下讲话,旨在激励学生们树立远大目标,发扬勤奋精神,并勇于创新。讲话中强调了目标的重要性,将其比喻为沙漠中的清泉、黑暗中的光亮和寒冬中的暖阳,揭示了目标对个人成长和...

    大学校园Photoshop设计与技术大赛活动策划书.docx

    活动主题“想象、设计、创意让一切皆有可能!”鼓励学生们发挥无限创意,用Photoshop这一强大的图像处理工具创作出独特的视觉作品。 二、活动时间与目标群体 活动将在社团文化节期间举行,面向南阳师范学院全体...

    一切皆有可能辐射诱变育种.docx

    【标题】"一切皆有可能:辐射诱变育种技术在CS中的应用" 【标签】"CS"(可能指的是计算机科学) 【部分内容】: 文档中提到的“辐射诱变育种”是一种生物学上的技术,主要应用于农业领域,通过辐射处理生物体(如...

    (中小学教育)一切皆有可能.ppt

    在这个名为“(中小学教育)一切皆有可能.ppt”的文件中,我们看到的不仅仅是关于一部电影《功夫熊猫》的故事,更是教育理念的体现。这个课件深入浅出地传达了一个核心观点:每个人都有潜力去实现自己的梦想,无论...

    小升初英语文章谚语50条.docx

    41. 一切皆有可能!Nothing is impossible! 鼓励人们勇敢面对挑战,相信一切皆有可能。 42. 让我们自己做。Let's do it by ourselves. 提倡独立自主,靠自己的能力解决问题。 43. 记住:面带微笑。Remember: Keep ...

    从“花小猪”学:一切商业皆有可能.docx

    从“花小猪”学:一切商业皆有可能.docx

    虚拟化_一切皆有可能.pdf

    虚拟化技术是一种革命性的IT解决方案,它改变了传统IT基础设施的构建和管理方式,使一切皆有可能。本文将深入探讨虚拟化的概念、应用、优势以及它如何帮助数据中心实现整合和业务连续性。 1、虚拟化概述 虚拟化是一...

    Lychee Linux:Linux商业版-开源

    以更实惠的方式获得强大的支持。 便宜,可靠,有准备! 多年来,我们的发行经历了巨大的发展。 首先,它是专门针对开发人员需求的发行版,但是多年来... 一切皆有可能! 登录! 您需要使用用户名:dev和密码:linux登录

    5分钟从零开始搭建一个独立博客网站

    用5分钟搭建一个独立博客网站,在云时代,一切皆有可能! 今天向大家介绍一个很优秀的框架,Hugo项目。通过Go语言开发,能够快速的生成静态博客、内容网站。通过HUGO可以几秒钟搭建一个完全属于自己的博客网站。 ...

    一切皆有可能辐射诱变育种.pdf

    。。。

    阿迪王(一切皆可改变)! Rust实现的常见数据结构,然而也许有Bug。.zip

    标题和描述中的“一切皆可改变”可能指的是Rust的借用和所有权系统,这是Rust的一个核心特性,确保了内存安全。在实现这些数据结构时,需要遵循这些规则,避免悬挂指针和数据竞争。"有Bug"提示我们可能需要关注错误...

Global site tag (gtag.js) - Google Analytics