if(FileExists(ExtractFileDir(Application->ExeName)+"\\path.ini")==FALSE)
{ /*我将目标程序的路径保存到了当前程序目录中的path.ini文件中,但如果当前程序第一次运行的话, 是不存在这个文件的,所以就可以用TOpdnDialog来打开了, 做这点只是为了方便,不用每次都得点目标程序*/
if(OpenFile->Execute()) { AnsiString AppPath="path="+ExtractFilePath(OpenFile->FileName); WritePrivateProfileSection("XY2PATH",AppPath.c_str(),(ExtractFileDir(Application->ExeName)+ "\\path.ini").c_str());//将目标程序的路径存到path.ini文件中。 }else { return; } }
//下面的代码开始启动目标程序
PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); si.lpReserved=NULL; si.lpDesktop=NULL; si.lpTitle=NULL; si.cbReserved2=0; si.lpReserved2=NULL; si.dwFlags=STARTF_USEPOSITION; si.dwX=0; si.dwY=0; char Appname[300];
GetPrivateProfileString("XY2PATH","path","",Appname,250,(ExtractFileDir(Application->ExeName)+ "\\path.ini").c_str());
strcat(Appname,"\\xy2.exe"); /*以上都在构建目标程序的环境设置,下面调用CreateProcess来启动目标程序, 注意将倒数第3个参数要填为目标程序的路径, 第6个参数为CREATE_SUSPENDED是为了将程序加载到内存中之后可以进行一些修改, 以更好的配合外挂程序的运行*/
if(CreateProcess(Appname,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,ExtractFileDir(Appname). c_str(),&si,&pi)==0) { //启动目标程序失败 showMessage("error open exe file"); return; } gamehandle=pi.hProcess;
/*在本节中要执行程序的话,最好将这个条件注释掉,我将在以后的教程中进行讲解,这里大概说一下功能, 第一个Write是为了跳过Update,第二个是为了退出的时候不打开网页, 我的电脑要是退出大话的时候打开网页的话,中间的时间可以抽上几根烟了,所以将程序改了*/
if(WriteProcessMemory(gamehandle,(void*)0x0042BC13,No_Update,1,NULL)==false ||WriteProcessMemory(gamehandle,(void*)0x00430a80,No_HTML,2,NULL)==false ) return; threadhand=pi.hThread; gamethreadid=pi.dwThreadId; //恢复程序,让程序执行 ResumeThread(pi.hThread); /*下面的代码也是本节中不需要的,我将物品的有关信息存到了当前目录(外挂启动程序目录)中的item.ini文件中, 但目标程序中并不知道外挂启动程序的路径,因此我在目标程序文件夹中建立了一个名字叫path.ini文件,里面包含了item.ini的路径*/
String inipath= "path="+ExtractFileDir(Application->ExeName)+"\\item.ini"; WritePrivateProfileSection("ITEM",inipath.c_str(),(ExtractFileDir(OpenFile->FileName)+ "\\path.ini").c_str());
|