进程列举操作

进程列举操作

1.    进程的概念

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。

对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。

进程是由进程控制块、程序段、数据段三部分组成。
http://baike.baidu.com/view/396362.htm

2.    进程和线程的简单理解

一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
     http://zhidao.baidu.com/question/66056106.html?fr=ala0

3.    进程操作的几个API

3.1.        CreateToolHelp32Snapshot

原型:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
所在单元:TlHelp32
CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]
快照就是snapshot,类似于screen-shot(屏幕快照,当你按prtscr键时抓的当前windows全屏) 进程快照就是当前系统中正在运行的所有进程列表,一般用CreateToolhelp32Snapshot得到.
关闭一个快照,调用CloseToolhelp32Snapshot函数。
不要调用CloseHandle函数关闭关照。这会造成内存泄漏。

3.2.        Process32FirstProcess32Next

process32First 是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄
  BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
  此函数往往和
  Process32Next(Handle hsnapShot, LPPROCESSENTRY32 lppe) 搭配使用,用来枚举当前系统快照相关的所有进程。

DELPHI 使用例子:

procedure TForm1.ProcessList(var pList: TList);
var
  p: ProcessInfo;
  ok: Bool;
  ProcessListHandle: THandle;
  ProcessStruct: TProcessEntry32;
begin
  PList := TList.Create;
  PList.Clear;
  ProcessListHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  ProcessStruct.dwSize := Sizeof(ProcessStruct);
  ok := Process32First(ProcessListHandle, ProcessStruct);
  while Integer(ok) <> 0 do
    begin
      new(p);
      p.ExeFile := ProcessStruct.szExeFile;
      p.ProcessID := ProcessStruct.th32ProcessID;
      PList.Add(p);
      ok := Process32Next(ProcessListHandle, ProcessStruct);
    end;

  CloseHandle(ProcessListHandle);
end;

3.3.        OpenProcess

  位置: Kernel32.dll

  OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。

  1.函数原型

  HANDLE OpenProcess(

  DWORD dwDesiredAccess, // access flag

  BOOL bInheritHandle,           // handle inheritance option

  DWORD dwProcessId             // process identifier

  );

  2.返回值:

  如成功,返回值为指定进程的句柄。
  如失败,返回值为空,可调用GetLastError获得错误代码。

3.4.        GetExitCodeProcess

  BOOL WINAPI GetExitCodeProcess(

  __in HANDLE hProcess,

  __out LPDWORD lpExitCode);

  获取一个已中断进程的退出代码

  返回值

  Long,非零表示成功,零表示失败。会设置GetLastError

  参数表

  参数 类型及说明

  hProcess Long,想获取退出代码的一个进程的句柄
  lpExitCode Long,用于装载进程退出代码的一个长整数变量。如进程尚未中止,则设为常数STILL_ACTIVE

3.5.        TerminateProcess

BOOL  TerminateProcess( 

   HANDLE            hProcess;  //  将被结束进程的句柄 

   UINT                uExitCode;  //  指定进程的退出码 

); 

用来结束一个进程
DELPHI
使用例子:

p := Current.Items[ListBox1.ItemIndex];
        h := openProcess(Process_All_Access, true, p.ProcessID);
        GetExitCodeProcess(h, a);
        if Integer(TerminateProcess(h, a)) <> 0 then //
成功

4.    附带获得所有窗口的操作

procedure ……
var
  hCurrentWindow:HWnd;
  szText:array[0..254]of char;
begin
  listbox2.clear;
  hCurrentWindow:=GetWindow(Handle,GW_HWNDFIRST);
  While hCurrentWindow<>0 Do
  Begin
    If GetWindowText(hCurrentWindow,@szText,255)>0 then
      ListBox2.Items.Add(Strpas(@szText));
    hCurrentWindow:=GetWindow(hCurrentWindow,GW_HWNDNEXT);
  end;
end;

注:为保证代码质量,以上代码大多来自《Delphi下深入Windows核心编程》

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值