eMule。emule中还有不少模块实现的功能挺有用,我说的是在其它的程序里很有用,可以考虑在其它程序中进行复用。
emule.cpp为类CemuleApp的实现。因此在运行时,首先会运行InitInstance进行一些初始化的工作。从这个函数里面我们也可以第一次看出那些即将在整个程序中发挥作用的类了。
最开始的时候是计算出程序常用的一些目录,如配置文件,日志文件等。接下来是ProcessCommandline,它的作用有两方面,第一是确认该eMule的运行方式,即命令行后面有没有参数,第二是确认目前eMule是不是只有一个实例在运行。在一般的情况下,双击eMule可执行文件是不会带参数的。但是通过点击链接或者打开关联文件的方式打开eMule则相当于带参数运行eMule。通过在
注册表里添加一些项目可以让一个
程序和某种链接或者某个后缀的文件产生关联。具体办法可以参见OtherFunctions.cpp中的Ask4RegFix,BackupReg,RevertReg三个函数的功能。ProcessCommandline中通过创建带有名称的互斥信号量来确认是否有其它的eMule实例在运行。对于一个确定的名称,CreateMutex只能创建一个互斥信号量。因此通过该信号量是否创建成功就可以知道是否有其它eMule实例运行。如果有的话,而且又是带参数的那种模式,那么直接把这个参数使用Windows的消息机制发给那个窗口即可,接下来的代码无非就是如何找到另外一个叫"eMule"的家伙以及给它发个什么消息。pstrPendingLink是一个全局变量,表示将要被处理的命令行参数。它将会在初始化完成后一段时间后被处理。
下面两个比较重要的类是CPreferences和CStatistics。前者掌握着程序的大部分配置数据,后者则进行各种统计。它们的特点都是有很多的
成员变量,而且还是静态的,这种方式可以保证它们的唯一性,而且把这些变量统一到一个类管理。但是实际上并不需要了解每个变量的含义。thePrefs和theStats是这两个类的唯一的实例。
在处理完其它一些事情,包括创建图形界面对象CemuleDlg后,接下来可以看到一排一排的创建新对象的语句。这些类将会实现eMule程序运行的主要功能,后面的系列将详细分析。
最后描述一下如何在VS2003里编译eMule,由于eMule中用到了一些其它的库,因此官方在提供eMule的
源代码下载的同时如果也提供这些库的下载会使源码包变得很大。因此eMule选择了让开发者去那些库的官方网站下载它们的方式。一般来说,编译这种工程文件,很重要的地方是要保持各个库和主程序编译参数的一致性。这些编译参数中,最主要的参数有三个,字符集(多字节/Unicode),调试/发行,单线程/多线程,这样排列组合一下就有八个版本了。因此编译的时候如果不注意,就会出现和程序设计无关的错误。
eMule0.47a解压后自带id3lib库,还需要下载以下的库:
zlib:
gzip.org/zlib/
ResizableLib:
sourceforge.net/projects/resizablelib/
Crypto++:
eskimo/~weidai/cryptlib.html
pnglib:
libpng.org/pub/png/libpng.html
下载它们,解压它们,编译它们。编译的时候注意要和eMule的工程的参数一致:字符集为Unicode,支持多线程安全,调试版或者是发行版可以根据需要选择,但是也要和eMule的工程参数一致。这些库的解压包里通常都能找到VC的工程文件,但是版本低一些,直接转化就可以了。另外建议编译这些库的时候都选择生成静态库,不要生成动态的库,这样最后生成的可执行文件就可以自己运行了。编译完这些库,包括从其它地方下载的和eMule自带的id3lib库和CxImage库后,就可以开始编译emule了。而编译emule也无非就是注意让它能够在编译的时候找到所有的头文件,以及在链接的时候能够找到所有的库。在链接的时候能够找到所有的