pvzclass是如何實(shí)現(xiàn)的?pvzclass源代碼初步分析(2) ProcessOpener
本篇將分析ProcessOpener(.h/.cpp),pvzclass中尋找PVZ進(jìn)程的代碼。
文中會(huì)涉及到一些Windows API函數(shù),這些函數(shù)不會(huì)細(xì)講。

1.ProcessOpener初探
ProcessOpener.h
定義尋找PVZ進(jìn)程所需的常量,并聲明尋找PVZ進(jìn)程所需的函數(shù)。
ProcessOpener.cpp
對(duì)ProcessOpener.h中定義的常量賦值。對(duì)ProcessOpener.h中聲明的函數(shù)進(jìn)行定義。
根據(jù)“源代碼文件解釋頭文件”的原則,我們先看頭文件:

windows.h包括尋找PVZ進(jìn)程必需的函數(shù)和變量類型(如以下代碼中的LPCWSTR)。
剩下的就是ProcessOpener類,其中包括四個(gè)常量和四個(gè)函數(shù)。
它們的具體作用就得去源代碼文件中尋找了。
2.ProcessOpener.cpp
ProcessOpener.cpp的作用如上所說,是將頭文件中的各種聲明予以實(shí)現(xiàn)。
開頭是這樣的:

你不需要知道"TLHELP32.H"和"direct.h"有什么用因?yàn)槲乙膊恢?/span>。
我們先來看最后的Open函數(shù):

Open函數(shù)的作用很簡單,即尋找PVZ進(jìn)程。其返回值為進(jìn)程的ID,或者是空(意味著沒找到PVZ進(jìn)程)。
在使用pvzclass的代碼開頭,基本上都需要定義一個(gè)變量存儲(chǔ)Open函數(shù)尋找的結(jié)果,因?yàn)楹竺孢€要用這個(gè)結(jié)果將PVZ類實(shí)例化。
而對(duì)于剩余的三個(gè)函數(shù),
OpenByProcessName依據(jù)進(jìn)程名尋找PVZ進(jìn)程(默認(rèn)為"PlantsVsZombies.exe"),OpenByWindowTitle依據(jù)PVZ的窗口標(biāo)題尋找PVZ進(jìn)程(默認(rèn)為"Plants vs. Zombies",而不是漢化版的“植物大戰(zhàn)僵尸中文版”),
OpenByFilePath依據(jù)PVZ本體的文件存儲(chǔ)位置尋找PVZ進(jìn)程(默認(rèn)為同一目錄下名為"PlantsVsZombies.exe"的文件)。
與另外兩個(gè)文件不同的是,OpenByFilePath可以在PVZ未開啟的情況下,直接開啟并找到PVZ進(jìn)程。
這也就是為什么有的基于pvzclass的修改器雖然要求先開PVZ再開修改器,但直接打開修改器也可以完美發(fā)揮作用。
當(dāng)然,我們也可以根據(jù)自己的需要(比如排除特定改版,只修改原版),類比Open函數(shù),或者只使用三個(gè)基本尋找函數(shù),設(shè)計(jì)符合需要的尋找進(jìn)程函數(shù),或者直接修改相應(yīng)的常量。
但!是!胡亂修改尋找函數(shù)可能導(dǎo)致這些函數(shù)無法運(yùn)行!如果你對(duì)Windows API函數(shù)不熟悉,千萬不要修改函數(shù)本身!

感覺有點(diǎn)少啊……
下一篇就要開始分析重中之重,PVZ.h了。