M
moonight59
Unregistered / Unconfirmed
GUEST, unregistred user!
有这么一段易语言写的内容,我想转成Delphi的,但是始终不行,请帮忙。<br>后面我会贴出我写的代码,请会做的朋友帮我改错或者另外写一份!<br>=================================================================<br>.程序集 窗口程序集1<br>.程序集变量 关键字, 字节集, , , /MsgEx.db<br>.程序集变量 路径分隔符, 字节集, , , /<br>.程序集变量 QQ进程名, 文本型, , , QQ.EXE<br>.程序集变量 耗时, 整数型<br><br>.子程序 _开始搜索_被单击<br>.局部变量 进程句柄, 整数型<br>.局部变量 进程快照, 整数型<br>.局部变量 进程信息, PROCESSENTRY32<br><br>耗时 = 取启动时间 ()<br><br>QQ进程名 = “QQ.EXE”<br>路径分隔符 = 到字节集 (“/”)<br>关键字 = 到字节集 (“/MsgEx.db”)<br><br>进程快照 = CreateToolhelp32Snapshot (#TH32CS_SNAPALL, 0)<br>.如果真 (进程快照 = 0)<br> 信息框 (“创建进程快照列表失败 .”, #信息图标, “提示”)<br> 返回 ()<br>.如果真结束<br>进程信息.dwSize = 296 ' = len (uProcess)<br>进程句柄 = Process32First (进程快照, 进程信息)<br><br>列表框1.清空 ()<br>.判断循环首 (进程句柄 ≠ 0)<br> .如果真 (寻找文本 (到文本 (进程信息.szExeFile), QQ进程名, , 真) ≠ -1)<br> 列表框1.加入项目 (“ID: ” + 到文本 (进程信息.th32ProcessID) + “ QQ号码: ” + 查找QQ号码 (进程信息.th32ProcessID), )<br> .如果真结束<br> 进程句柄 = Process32Next (进程快照, 进程信息)<br>.判断循环尾 ()<br>CloseHandle (进程快照)<br><br>耗时 = 取启动时间 () - 耗时<br>标签1.标题 = “耗时: ” + 到文本 (耗时) + “ 毫秒”<br><br>.子程序 查找QQ号码, 文本型<br>.参数 进程ID, 整数型<br>.局部变量 操作句柄, 整数型<br>.局部变量 内存地址, 整数型<br>.局部变量 读取结果, 整数型<br>.局部变量 内存块长度, 整数型<br>.局部变量 开始地址, 整数型<br>.局部变量 结束地址, 整数型<br>.局部变量 数据缓冲区, 字节集<br>.局部变量 QQ号码, 文本型<br>.局部变量 内存块信息, MEMORY_BASIC_INFORMATION<br>.局部变量 地址偏移, 整数型<br>.局部变量 地址值, 字节型<br><br>操作句柄 = OpenProcess (#PROCESS_VM_READ + #PROCESS_QUERY_INFORMATION, 0, 进程ID)<br>.如果真 (操作句柄 = 0)<br> 信息框 (“不能打开进程 .”, #信息图标, “提示”)<br> 返回 (“”)<br>.如果真结束<br><br>内存块长度 = 28<br>.判断循环首 (真)<br> .如果真 (VirtualQueryEx (操作句柄, 内存地址, 内存块信息, 内存块长度) = 0)<br> CloseHandle (操作句柄)<br> 返回 (“”)<br> .如果真结束<br><br> .如果真 (内存块信息.Type = #MEM_PRIVATE 且 内存块信息.Protect = #PAGE_READWRITE)<br> 数据缓冲区 = 取空白字节集 (内存块信息.RegionSize)<br> 读取结果 = ReadProcessMemory (操作句柄, 内存地址, 数据缓冲区, 内存块信息.RegionSize, 0)<br> .如果 (读取结果 ≠ 0)<br> 结束地址 = 寻找字节集 (数据缓冲区, 关键字, )<br> .判断循环首 (结束地址 ≠ -1)<br> 开始地址 = 倒找字节集 (数据缓冲区, 路径分隔符, 结束地址 - 1)<br> .如果真 (开始地址 ≠ -1 且 结束地址 - 开始地址 < 16 且 结束地址 - 开始地址 > 4)<br> .变量循环首 (开始地址 + 1, 结束地址 - 1, 1, 地址偏移) ' 判断是否为数字格式<br> 地址值 = 取字节集数据 (取字节集中间 (数据缓冲区, 地址偏移, 1), #字节型)<br> .如果真 (地址值 < 48 或 地址值 > 57)<br> 跳出循环 ()<br> .如果真结束<br><br> .变量循环尾 ()<br> .如果真 (地址偏移 = 结束地址)<br> QQ号码 = 取字节集数据 (取字节集中间 (数据缓冲区, 开始地址 + 1, 结束地址 - 开始地址 - 1), #文本型)<br> CloseHandle (操作句柄)<br> 返回 (QQ号码)<br> .如果真结束<br><br> .如果真结束<br> 结束地址 = 寻找字节集 (数据缓冲区, 关键字, 结束地址 + 1)<br> .判断循环尾 ()<br> .否则<br> ' 输出调试文本 (“不能读取内存块: ” + 到文本 (内存地址))<br> .如果结束<br><br> .如果真结束<br> 内存地址 = 内存地址 + 内存块信息.RegionSize<br>.判断循环尾 ()<br>CloseHandle (操作句柄)<br>返回 (“”)<br>==========================================================<br><br><br>我的程序代码:<br>==========================================================<br>unit Unit1;<br><br>interface<br><br>uses<br> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> Dialogs, ComCtrls, UnitEndQQ, StdCtrls;<br><br>type<br> TForm1 = class(TForm)<br> List: TListView;<br> btn1: TButton;<br> procedure ListDblClick(Sender: TObject);<br> procedure btn1Click(Sender: TObject);<br> private<br> { Private declarations }<br> public<br> { Public declarations }<br> end;<br><br>var<br> Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>function IsNum(str: string): Boolean;<br>var<br> i: Integer;<br>begin<br> Result:=TryStrToInt(str,i);<br>end;<br><br>procedure GetInfoFromProcess(var NumList, PIDList: TStringList);<br>var<br> i,position: Integer;<br> PIDlistTemp: TStringList;<br> Phd, n: Cardinal;<br> bAddr: DWORD;<br> MyChars: array of Char;<br> PInfo, QQnum: string;<br> Sys_Info: _SYSTEM_INFO;<br> MemInfo: MEMORY_BASIC_INFORMATION;<br> find: Boolean;<br>begin<br> PIDlistTemp:=TStringList.Create;<br> GetProcessIDs('QQ.exe',PIDlistTemp);<br> PIDList.Assign(PIDlistTemp);<br> GetProcessIDs('TM.exe',PIDlistTemp);<br> PIDList.Add(PIDlistTemp.Text);<br> PIDlistTemp.Free;<br> for i:=PIDList.Count-1 downto 0 do<br> begin<br> if(not IsNum(PIDList.Strings))then<br> begin<br> PIDList.Delete(i);<br> end; <br> end;<br> for i:=0 to PIDList.Count-1 do<br> begin<br> find:=False;<br> Phd:=OpenProcess(PROCESS_VM_READ + PROCESS_QUERY_INFORMATION,<br> False,StrToInt(PIDList.Strings));<br> if(Phd>0)then<br> begin<br> GetSystemInfo(Sys_Info);<br> bAddr:=DWORD(Sys_Info.lpMinimumApplicationAddress);<br> while(not find)and(VirtualQueryEx(Phd,Pointer(bAddr),MemInfo,SizeOf(MemInfo))<>0)do<br> begin<br> if(MemInfo.Type_9=MEM_PRIVATE)and(MemInfo.AllocationProtect=PAGE_READWRITE)then<br> begin<br> SetLength(MyChars,MemInfo.RegionSize);<br> if(ReadProcessMemory(Phd,Pointer(bAddr),@MyChars,MemInfo.RegionSize,n))<br> and(n>0)then<br> begin<br> PInfo:=Trim(string(MyChars));<br> position:=Pos('/MsgEx.db',PInfo);<br> while(not find)and(position>5)do //1<br> begin<br> Delete(PInfo,1,position-12);<br> if(position>5)then //2<br> begin<br> if(PInfo[position-1] in ['0'..'9'])then //3<br> begin<br> Dec(position);<br> QQnum:='';<br> while(PInfo[position] in ['0'..'9'])do //4<br> begin<br> QQnum:=QQnum+PInfo[position];<br> Dec(position);<br> end; //4<br> find:=True;<br> end;//3<br> end;//2<br> end;//1<br> end;<br> end;<br> bAddr:=bAddr+MemInfo.RegionSize;<br> end;<br> CloseHandle(Phd);<br> if(QQnum='')then QQnum:='0';<br> NumList.Add(QQnum);<br> end;<br> end;<br>end;<br><br>procedure TForm1.ListDblClick(Sender: TObject);<br>begin<br> EndOneProcess(StrToInt(List.Selected.SubItems[0]));<br>end;<br><br>procedure TForm1.btn1Click(Sender: TObject);<br>var<br> NL,PIDL: TStringList;<br> i: Integer;<br>begin<br> NL:=TStringList.Create;<br> PIDL:=TStringList.Create;<br> GetInfoFromProcess(NL,PIDL);<br> List.Clear;<br> for i:=0 to PIDL.Count-1 do<br> begin<br> with List.Items.Add do<br> begin<br> Caption:=NL.Strings;<br> SubItems.Add(PIDL.Strings);<br> end;<br> end;<br> NL.Free;<br> PIDL.Free;<br>end;<br><br>end.<br>/////////////////////////////////////////////////<br>unit UnitEndQQ;<br><br>interface<br><br>uses<br> Windows, Classes, SysUtils, TLHelp32;<br><br>procedure EndOneProcess(PID: Cardinal); //需要uses TLHelp32;<br>procedure EndProcess(AFileName: string); //需要uses TLHelp32;<br>procedure EnumProcess(AFileName: string; var Num: Integer);<br>procedure GetProcessIDs(AFileName: string; var IDs: TStringList);<br><br>implementation<br><br>const<br> PROCESS_TERMINATE = $0001;<br><br>procedure EndOneProcess(PID: Cardinal); //需要uses TLHelp32;<br>begin<br> TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), PID), 0);<br>end;<br><br>procedure EndProcess(AFileName: string); //需要uses TLHelp32;<br>var<br> ContinueLoop: BOOL;<br> FSnapShotHandle: THandle;<br> FProcessEntry32: TProcessEntry32;<br>begin<br> FSnapShotHandle:=CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);<br> FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);<br> ContinueLoop:=Process32First(FSnapshotHandle, FProcessEntry32);<br> while ContinueLoop do<br> begin<br> if((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName))<br> or(UpperCase(FProcessEntry32.szExeFile)=UpperCase(AFileName)))then<br> TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0);<br> ContinueLoop:=Process32Next(FSnapshotHandle, FProcessEntry32);<br> end;<br>end;<br><br>procedure EnumProcess(AFileName: string; var Num: Integer);<br>var<br> ContinueLoop: BOOL;<br> FSnapShotHandle: THandle;<br> FProcessEntry32: TProcessEntry32;<br>begin<br> FSnapShotHandle:=CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);<br> FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);<br> ContinueLoop:=Process32First(FSnapshotHandle, FProcessEntry32);<br> Num:=0;<br> while ContinueLoop do<br> begin<br> if((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName))<br> or(UpperCase(FProcessEntry32.szExeFile)=UpperCase(AFileName)))then<br> begin<br> Inc(Num);<br> end;<br> ContinueLoop:=Process32Next(FSnapshotHandle, FProcessEntry32);<br> end;<br>end;<br><br>procedure GetProcessIDs(AFileName: string; var IDs: TStringList);<br>var<br> ContinueLoop: BOOL;<br> FSnapShotHandle: THandle;<br> FProcessEntry32: TProcessEntry32;<br>begin<br> if IDs=nil then Exit;<br> IDs.Clear;<br> FSnapShotHandle:=CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);<br> FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);<br> ContinueLoop:=Process32First(FSnapshotHandle, FProcessEntry32);<br> while ContinueLoop do<br> begin<br> if((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName))<br> or(UpperCase(FProcessEntry32.szExeFile)=UpperCase(AFileName)))then<br> IDs.Add(IntToStr(FProcessEntry32.th32ProcessID));<br> ContinueLoop:=Process32Next(FSnapshotHandle, FProcessEntry32);<br> end;<br>end;<br><br>end.