1。获得进程ID;
2.用OPENPROCESS打开进程并取得句柄;
3。用VirtualQueryEx反复查询内存,同时写一句代码把MEMORY_BASIC_INFORMATION.state=MEM_COMMIT时的RegionSize累加起来,直到VirtualQueryEx返回值不等于SIZEOF(MEMORY_BASIC_INFORMATION)。这时那个累加值就是你要的了(以BYTE为单位)
代码如下(内存大小自己做吧):
//进程结构
TProcessInfo=Record
ExeFileName:String;
ProcessID
Word;
end;
//关闭进程processname
function FindProcess(processname: string): boolean;
var
p:TProcessInfo;
OK:Bool;
ProcessListHandle:THandle;
ProcessStruct:TProcessEntry32;
begin
result:=false;
ProcessListHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
ProcessStruct.dwSize:=SizeOf(ProcessStruct);
OK:=Process32First(ProcessListHandle,ProcessStruct);
while Integer(OK)<>0 do
begin
p.ExeFileName:=ProcessStruct.szExeFile;
p.ProcessID:=ProcessStruct.th32ProcessID;
OK:=Process32Next(ProcessListHandle,ProcessStruct);
if uppercase(p.ExeFileName)=uppercase(processname) then
begin
showmessage('p.ProcessID:'+inttostr(p.ProcessID));
terminateprocess(p.ProcessID,0); //进程标识不是进程句柄
result:=true;
exit;
end;
end;
closehandle(ProcessListHandle);
end;
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
begin
showmessage('FProcessEntry32.th32ProcessID:'+inttostr(FProcessEntry32.th32ProcessID));
showmessage('OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID):'+inttostr(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID)));
Result := Integer(TerminateProcess(OpenProcess( //进程句柄通过OpenProcess获得
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0)); //关闭进程
end;
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;