7. 如何终止进程的运行?
(1) 使主线程的进入点函数返回(最好使用这个方法)。
这是保证所有线程资源能够得到正确清除的唯一办法。
让主线程的进入点函数返回,可以确保下列操作的实现:
•该线程创建的任何C++对象将能使用它们的析构函数正确地撤消。
•操作系统将能正确地释放该线程的堆栈使用的内存。
•系统将进程退出代码(在进程的内核对象中维护)设为进入点函数返回值。
•系统将进程内核对象的使用计数递减1。
(2) 进程中的一个线程调用ExitProcess函数(应该避免使用这种方法)。
显式调用ExitProcess和ExitThread是程序不能正确将自己清除的常见原因。调用ExitThread时,进程将继续运行,但可能会泄漏内存或其他资源。
(3) 另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。
只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。
(4) 进程中的所有线程自行终止运行(这种情况几乎从未发生)。
如果进程中的所有线程全部终止运行,操作系统就认为没有理由继续保留进程的地址空间。
一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。

解决方案 »

  1.   

    uses
      tlhelp32;
    procedure TForm1.Button1Click(Sender: TObject);  function KillTask(ExeFileName: string): integer;
    const
    PROCESS_TERMINATE=$0001;
    var
    ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
    begin
    result := 0;
    FSnapshotHandle := CreateToolhelp32Snapshot
    (TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
    while integer(ContinueLoop) <> 0 do
    begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(ExeFileName))
    or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(ExeFileName))) then
       Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
    end;
    end;
    begin
    killtask(edit1.text);
    end;
    其中edit1.text的内容就是已知进程名
      

  2.   

    老大
    你在窗体上放一个BUTTON
    放一个EDIT
    把这段代码放进BUTTON。ONCLICK里
    这就是例子呀