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;

解决方案 »

  1.   

    第二种:procedure NewProcess(ProcessID: DWORD);
    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;