pvzclass是如何实现的?pvzclass源代码初步分析(2) ProcessOpener
本篇将分析ProcessOpener(.h/.cpp),pvzclass中寻找PVZ进程的代码。
文中会涉及到一些Windows API函数,这些函数不会细讲。

1.ProcessOpener初探
ProcessOpener.h
定义寻找PVZ进程所需的常量,并声明寻找PVZ进程所需的函数。
ProcessOpener.cpp
对ProcessOpener.h中定义的常量赋值。对ProcessOpener.h中声明的函数进行定义。
根据“源代码文件解释头文件”的原则,我们先看头文件:

windows.h包括寻找PVZ进程必需的函数和变量类型(如以下代码中的LPCWSTR)。
剩下的就是ProcessOpener类,其中包括四个常量和四个函数。
它们的具体作用就得去源代码文件中寻找了。
2.ProcessOpener.cpp
ProcessOpener.cpp的作用如上所说,是将头文件中的各种声明予以实现。
开头是这样的:

你不需要知道"TLHELP32.H"和"direct.h"有什么用因为我也不知道。
我们先来看最后的Open函数:

Open函数的作用很简单,即寻找PVZ进程。其返回值为进程的ID,或者是空(意味着没找到PVZ进程)。
在使用pvzclass的代码开头,基本上都需要定义一个变量存储Open函数寻找的结果,因为后面还要用这个结果将PVZ类实例化。
而对于剩余的三个函数,
OpenByProcessName依据进程名寻找PVZ进程(默认为"PlantsVsZombies.exe"),OpenByWindowTitle依据PVZ的窗口标题寻找PVZ进程(默认为"Plants vs. Zombies",而不是汉化版的“植物大战僵尸中文版”),
OpenByFilePath依据PVZ本体的文件存储位置寻找PVZ进程(默认为同一目录下名为"PlantsVsZombies.exe"的文件)。
与另外两个文件不同的是,OpenByFilePath可以在PVZ未开启的情况下,直接开启并找到PVZ进程。
这也就是为什么有的基于pvzclass的修改器虽然要求先开PVZ再开修改器,但直接打开修改器也可以完美发挥作用。
当然,我们也可以根据自己的需要(比如排除特定改版,只修改原版),类比Open函数,或者只使用三个基本寻找函数,设计符合需要的寻找进程函数,或者直接修改相应的常量。
但!是!胡乱修改寻找函数可能导致这些函数无法运行!如果你对Windows API函数不熟悉,千万不要修改函数本身!

感觉有点少啊……
下一篇就要开始分析重中之重,PVZ.h了。