进程列举操作
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. Process32First、Process32Next
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核心编程》