关于for循环的使用(50分)

  • 主题发起人 主题发起人 jxgxy
  • 开始时间 开始时间
J

jxgxy

Unregistered / Unconfirmed
GUEST, unregistred user!
下面这个函数返回了进程列表

//----------------------------------------------------------------------------
//返回进程列表
function GetProcessList:TStringList;
var
ContinueLoop:Bool;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
ProcessList:TStringList;
begin
ProcessList := TStringList.Create;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while ContinueLoop do
begin
ProcessList.Add(FProcessEntry32.sZExeFile);
Continueloop:=process32next(fsnapshothandle,fprocessentry32);
end;
Result := ProcessList;
end;

下面这个函数是根据进程id返回模块列表

//----------------------------------------------------------------------------
//根据进程id返回模块列表
function GetProcessModuleList(ProcessId:integer):TStringList;
var
modSnapShot: THandle;
mProcess: TMODULEENTRY32;
FProcessEntry32:TProcessEntry32;
ret: Bool;
ModuleList:TStringList;
begin
ModuleList := TStringList.Create;
modSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId)
//模块快照
mProcess.dwSize := sizeof(TMODULEENTRY32)
//初始化TMODULEENTRY32结构大小
ret := module32first(modSnapShot, mProcess)
//第一个模块
while ret do begin
ModuleList.Add(mProcess.szModule);
ret := module32next(modSnapShot, mProcess)
//寻找下一个模块
end;
Result := ModuleList;
end;

我现在要做的是用一个for循环 将每一个进程的所有模块列表 添加到memo1中或stringlist中去,假如每个进程有10个模块,一共有20个进程,那么memo1中就有200个模块列表,请问这个for循环怎么写,或者是否有更为简捷的方法可以实现,为盼!
 
嵌套循环不成吗?
for i=0 to 进程数
memo1.line.add();
for j=0 to 模块楼
memo1.line.add()
end
end;
不知道理解的对不对
 
上面 xuegaoyili 的循环应该就是的了,但是memo1里面把进程也添加进去了
应该是这样能满足要求了吧
for i=0 to 进程数
for j=0 to 模块楼
memo1.line.add()
end
end;
 
我用for循环嵌套做好了,可是不知道为什么project1.exe这个进程会取二次模块列表,也就是程序本身,为什么??


procedure TForm1.ShowProcess;
var
i,j:integer;
n1,n2:integer;
begin
mmo1.Lines := GetProcessList;
n1 := mmo1.Lines.Count;
for i := 0 to n1-1 do
begin
mmo2.Lines := GetProcessModuleList(GetProcessId(mmo1.Lines.Strings));
n2 := mmo2.Lines.Count;
for j := 0 to n2-1 do
begin
mmo3.Lines.Add(mmo2.Lines.Strings[j]);
end;
end;
end;
 
有一个是这个程序本身,还有一个是[System Process],查了好久弄出来的

猜想有可能是因为,我们调用的那些函数是系统进程处理的,

procedure TMainForm.Button1Click(Sender: TObject);
var
i, j: integer;
slProcess, slModule : TStringList;
strProcessName : string;
TreeNode : TTreeNode;
begin
tvProcessList.Items.Clear;
slProcess := TStringList.Create;
slModule := TStringList.Create;
try
slProcess := GetProcessList;
for i := 0 to slProcess.Count - 1 do begin
strProcessName := slProcess.Strings;
TreeNode := tvProcessList.Items.AddChild(nil, strProcessName);
slModule := GetProcessModuleList(getProcessID(strProcessName));
for j := 0 to slModule.Count - 1 do begin
tvProcessList.Items.AddChild(TreeNode, slModule.Strings[j]);
end;
end;
finally
slModule.Free;
slProcess.Free;
end;
end;
 
后退
顶部