procedure TfrmMain.ProcessListPro;
var
ok:Bool;
Item: TListItem;
ProcessListHandle:THandle;//进程列表的句柄
ProcessStruct:TProcessEntry32;//进程的结构,进程的信息都在这个结构里面
begin
ProcessLists.Items.Clear ;
//利用CreateToolhelp32Snapshot函数取得进程列表的句柄
ProcessListHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPProcess,0);
//首先给出进程结构的大小
ProcessStruct.dwSize:=Sizeof(ProcessStruct);
//得到第一个进程
ok:=Process32First(ProcessListHandle,ProcessStruct);
while integer(ok)<>0 do
begin
if not (ProcessStruct.th32ProcessID in [0,8,164]) then
begin
Item:=ProcessLists.Items.Add;
//由id获路径
Item.Caption:=ProcessIdPath(ProcessStruct.th32ProcessID);
Item.SubItems.Add(IntToStr(ProcessStruct.th32ProcessID));
//并行线程
Item.SubItems.Add(IntToStr(ProcessStruct.cntThreads));
//进程优先级
Item.SubItems.Add(IntToStr(ProcessStruct.pcPriClassBase));
end;
ok:=Process32Next(ProcessListHandle,ProcessStruct);
end;
end;//Win2000下面获得该进程的路径及其调用DLL文件的相关信息
function TFrmMain.ProcessIdPath(var ProcessID:DWORD):string;
var
i : Integer;
Count : DWORD;
ProcHand : THandle;
ModHandles: array [0..$3FFF - 1] of DWORD;
ModInfo : TModuleInfo;
ModName : array [0..MAX_PATH] of Char;
// Item : TListItem;
FProcessID: DWORD;
begin
FProcessID:=ProcessID;
ProcHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
ProcessID);
if ProcHand <> 0 then
begin
try
EnumProcessModules(ProcHand, @ModHandles, SizeOf(ModHandles), Count);
for i := 0 to (Count div SizeOf(DWORD)) - 1 do
begin
application.ProcessMessages ;
if (GetModuleFileNameEx(ProcHand, ModHandles[i], ModName,
SizeOf(ModName)) > 0) and GetModuleInformation(ProcHand,
ModHandles[i], @ModInfo, SizeOf(ModInfo)) then
if i=0 then Result:=ModName;
{ //以下获得该进程调用的dll文件及其相关信息
with ModInfo do
begin
Item:=ListView1.Items.Add;
Item.Caption:=ModName;
//调用dll文件的基地址
Item.SubItems.Add(IntToHex(DWord(lpBaseOfDll),8));
Item.SubItems.Add(IntToHex(DWord(SizeOfImage),8));
//调用dll文件的入口地址
Item.SubItems.Add(IntToHex(DWord(EntryPoint),8));
}
end;
finally
CloseHandle(ProcHand);
end;
end;
end;
var
ok:Bool;
Item: TListItem;
ProcessListHandle:THandle;//进程列表的句柄
ProcessStruct:TProcessEntry32;//进程的结构,进程的信息都在这个结构里面
begin
ProcessLists.Items.Clear ;
//利用CreateToolhelp32Snapshot函数取得进程列表的句柄
ProcessListHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPProcess,0);
//首先给出进程结构的大小
ProcessStruct.dwSize:=Sizeof(ProcessStruct);
//得到第一个进程
ok:=Process32First(ProcessListHandle,ProcessStruct);
while integer(ok)<>0 do
begin
if not (ProcessStruct.th32ProcessID in [0,8,164]) then
begin
Item:=ProcessLists.Items.Add;
//由id获路径
Item.Caption:=ProcessIdPath(ProcessStruct.th32ProcessID);
Item.SubItems.Add(IntToStr(ProcessStruct.th32ProcessID));
//并行线程
Item.SubItems.Add(IntToStr(ProcessStruct.cntThreads));
//进程优先级
Item.SubItems.Add(IntToStr(ProcessStruct.pcPriClassBase));
end;
ok:=Process32Next(ProcessListHandle,ProcessStruct);
end;
end;//Win2000下面获得该进程的路径及其调用DLL文件的相关信息
function TFrmMain.ProcessIdPath(var ProcessID:DWORD):string;
var
i : Integer;
Count : DWORD;
ProcHand : THandle;
ModHandles: array [0..$3FFF - 1] of DWORD;
ModInfo : TModuleInfo;
ModName : array [0..MAX_PATH] of Char;
// Item : TListItem;
FProcessID: DWORD;
begin
FProcessID:=ProcessID;
ProcHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
ProcessID);
if ProcHand <> 0 then
begin
try
EnumProcessModules(ProcHand, @ModHandles, SizeOf(ModHandles), Count);
for i := 0 to (Count div SizeOf(DWORD)) - 1 do
begin
application.ProcessMessages ;
if (GetModuleFileNameEx(ProcHand, ModHandles[i], ModName,
SizeOf(ModName)) > 0) and GetModuleInformation(ProcHand,
ModHandles[i], @ModInfo, SizeOf(ModInfo)) then
if i=0 then Result:=ModName;
{ //以下获得该进程调用的dll文件及其相关信息
with ModInfo do
begin
Item:=ListView1.Items.Add;
Item.Caption:=ModName;
//调用dll文件的基地址
Item.SubItems.Add(IntToHex(DWord(lpBaseOfDll),8));
Item.SubItems.Add(IntToHex(DWord(SizeOfImage),8));
//调用dll文件的入口地址
Item.SubItems.Add(IntToHex(DWord(EntryPoint),8));
}
end;
finally
CloseHandle(ProcHand);
end;
end;
end;
解决方案 »
- 新手上路,请大家讨论一下应该怎样上路?
- 关于FASTREPORT动态制作报表预览后的打印问题
- Image控件怎样得到从Powerpoint复制的图像内容
- 帮忙修改一下此函数中的错误,不甚感激
- ★$0006中的$是什么意思?
- 请问为什么点关闭按钮时,delphi会卡住?
- REPORT MACHINE报表的问题
- 如何把一个自定义的类对象写进一个文件
- 如何设置TStringGrid的每列的对齐方式,如左对齐右对齐等
- DELPHI如何处理事务嵌套?(应该很简单,可我...)
- 谁能帮忙, 我想画类似于箭头, 在WINDOWS 的上点击栏目头,可以自动排序,箭头可以跟着变化,
- ????? 在delphi里能否潜入flash动化。?????
var
I: Integer;
Count: DWORD;
ProcHand: THandle;
ModHandles: array[0..$3FFF - 1] of DWORD;
ModInfo: TModuleInfo;
ModName: array[0..MAX_PATH] of char;
Item: TListItem;
var FProcessID:DWORD;
begin
FProcessID:=ProcessID;
ProcHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
ProcessID);
if ProcHand = 0 then
raise Exception.Create('No information available for this process/driver');
try
EnumProcessModules(ProcHand, @ModHandles, SizeOf(ModHandles), Count);
for I := 0 to (Count div SizeOf(DWORD)) - 1 do
if (GetModuleFileNameEx(ProcHand, ModHandles[I], ModName,
SizeOf(ModName)) > 0) and GetModuleInformation(ProcHand,
ModHandles[I], @ModInfo, SizeOf(ModInfo)) then
with ModInfo do
begin
Item:=Form1.ListView1.Items.Add;
Item.Caption:=ModName;
Item.SubItems.Add(IntToHex(DWord(lpBaseOfDll),8));
Item.SubItems.Add(IntToHex(DWord(SizeOfImage),8));
Item.SubItems.Add(IntToHex(DWord(EntryPoint),8));
end;
finally
CloseHandle(ProcHand);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var SnapShot:THandle;
NoError:Bool;
lppe: TProcessEntry32;
begin
SnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if SnapShot=-1 then
begin
ShowMessage('Error');
Halt;
end;
NoError:=Process32First(Snapshot,lppe);
if NoError=False then
begin
ShowMEssage('Error2');
Halt;
end;
While (NoError=True) do
begin
Memo1.Lines.Add('ProcessId--------'+inttostr(lppe.th32ProcessID));
Memo1.Lines.Add(lppe.szExeFile);
Memo1.Lines.Add('-----------------------------------------------');
NoError:=Process32Next(Snapshot,lppe);
end;
// Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
end;
procedure TForm1.Button2Click(Sender: TObject);
var HProcess:THandle;
begin
if Edit1.Text<>'' then
begin
NewProcess(StrToInt64(Edit1.Text));
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var HProcess:THandle;
begin
if Edit1.Text<>'' then
begin
HProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,StrToInt(Edit1.Text));
if HProcess=0 then
begin
ShowMessage('Open Error');
Halt;
end;
if TerminateProcess(HProcess,0)=True then
begin
ShowMessage('Success');
end
else
begin
ShowMessage('Error Terminate');
end;
end;end;