如何查看一个进程的进程树以及一些信息和结束进程树
解决方案 »
- 跨进程把数据导入到DBGrid报错
- TActiveForm中在Initialize中为引用赋值和在ActiveFormCreate为引用赋值区别?
- vs2005编译器可以扩展吗?类似于Delphi提供的Open Tool Api 请高手指点。
- 2个多边形,其中一个包围另一个,如何将中间的环带区域涂成红色?
- 请问关于TQRDBText内中文本换行的问题
- 求救!!!用DELPHI如何控制卷轴打印机,请教高手.....
- window64 位系统的C:\Windows\System32\drivers无法访问??
- 征:Formula One 6最新版下载:)
- 100分询问DELPHI数据库制作方法
- 代码编辑器右上角的左右箭头和下拉箭头是干什么的?什么时候能用?
- StringGrid1.LoadFromResourceName( HInstance, 'BMP_BRD' );什么意思?在线
- 能否将DLL文件编译到EXE文件中?
Delphi开发人员手册第14章有详细介绍,我给你抄段代码的主要部分,是把线程信息显示到listview的。
procedure TWin9xInfo.FillProcessInfoList(ListView: TListView;
ImageList: TImageList);
var
I: Integer;
ExeFile: string;
PE: TProcessEntry32;
HAppIcon: HIcon;
begin
Refresh;
ListView.Columns.Clear;
ListView.Items.Clear;
for I := Low(ProcessInfoCaptions) to High(ProcessInfoCaptions) do
with ListView.Columns.Add do
begin
if I = 0 then Width := 285
else Width := 75;
Caption := ProcessInfoCaptions[I];
end;
for I := 0 to FProcList.Count - 1 do
begin
PE := PProcessEntry32(FProcList.Items[I])^;
HAppIcon := ExtractIcon(HInstance, PE.szExeFile, 0);
try
if HAppIcon = 0 then HAppIcon := FWinIcon;
ExeFile := PE.szExeFile;
if ListView.ViewStyle = vsList then
ExeFile := ExtractFileName(ExeFile);
// insert new item, set its caption, add subitems
with ListView.Items.Add, SubItems do
begin
Caption := ExeFile;
Data := FProcList.Items[I];
Add(IntToStr(PE.cntThreads));
Add(IntToHex(PE.th32ProcessID, 8));
Add(IntToHex(PE.th32ParentProcessID, 8));
if ImageList <> nil then
ImageIndex := ImageList_AddIcon(ImageList.Handle, HAppIcon);
end;
finally
if HAppIcon <> FWinIcon then DestroyIcon(HAppIcon);
end;
end;
end;
var
PE: TProcessEntry32;
PPE: PProcessEntry32;
begin
FProcList.Clear;
if FSnap > 0 then CloseHandle(FSnap);
FSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if FSnap = INVALID_HANDLE_VALUE then
raise Exception.Create('CreateToolHelp32Snapshot failed');
PE.dwSize := SizeOf(PE);
if Process32First(FSnap, PE) then // get process
repeat
New(PPE); // create new PPE
PPE^ := PE; // fill it
FProcList.Add(PPE); // add it to list
until not Process32Next(FSnap, PE); // get next process
end;
{
lvwProcess->Items->Clear();
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
// if(hSnapshot==(HANDLE)-1)
// {
// Application->MessageBox("程序运行失败", "错误",
// MB_OK+ MB_ICONEXCLAMATION);
// return;
// }
StatusBar1->Panels->Items[0]->Text = "进程";
StatusBar1->Panels->Items[1]->Text =
"选择一进程可以查看它调用的模块信息";
char Hex[14];
TListItem *ListItem;
PROCESSENTRY32 pe;
AnsiString FileName;
AnsiString File;
AnsiString Path;
pe.dwSize=sizeof(pe);
for(int i=Process32First(hSnapshot,&pe);i;i=Process32Next(hSnapshot,&pe))
{
FileName=pe.szExeFile;
if (FileName.Pos('\\')==0)
{ File=FileName;
Path=FileName;
}
else
{
for(int i=FileName.Length();i>0;i--)
if(FileName.IsPathDelimiter(i))
{
File=FileName.SubString(i+1,FileName.Length());
Path=FileName.SubString(1,i);
break;
}
}
/*
typedef struct tagPROCESSENTRY32
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
CHAR szExeFile[MAX_PATH]; // Path
}
typedef struct tagTHREADENTRY32
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ThreadID; // this thread
DWORD th32OwnerProcessID; // Process this thread is associated with
LONG tpBasePri;
LONG tpDeltaPri;
DWORD dwFlags;
}BOOL
WINAPI
Thread32First(
HANDLE hSnapshot,
LPTHREADENTRY32 lpte
);BOOL
WINAPI
Thread32Next(
HANDLE hSnapshot,
LPTHREADENTRY32 lpte
);
*/
ListItem= lvwProcess->Items->Add();
ListItem->Caption = File; // 文件名
{
intToHex(pe.th32ProcessID,Hex);
ListItem->SubItems->Add(Hex); // 进程ID
}
{
AnsiString Tmp(pe.pcPriClassBase);
ListItem->SubItems->Add(Tmp); // 进程优先权
}
{
intToHex(pe.th32ParentProcessID,Hex);
ListItem->SubItems->Add(Hex); // 父进程ID
}
{
AnsiString Tmp(pe.cntThreads);
ListItem->SubItems->Add(Tmp); // 创建线程个数
}
// ListItem->SubItems->Add(Path); // 文件路径
{
AnsiString Tmp((int)pe.th32ProcessID);
ListItem->SubItems->Add(Tmp); // 进程ID
}
}
CloseHandle(hSnapshot);
}
//---------------------------------------------------------------------------
{
if(!lvwProcess->SelCount)return;
AnsiString ProcessID=lvwProcess->Selected->SubItems->Strings[4];
DWORD ID=(DWORD)ProcessID.ToInt();
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,false,ID);
if(hProcess!=NULL)
if(TerminateProcess(hProcess,1))return;
Application->MessageBoxA("操作失败","失败",MB_OK | MB_ICONERROR);
}