已知窗体的句柄和进程名
但是在该程序在出现错误时用TerminateProcess杀进程无效
杀不昝,只会重复弹出错误窗口!
请问各位大侠还有什么方法杀掉进程!
急求...
但是在该程序在出现错误时用TerminateProcess杀进程无效
杀不昝,只会重复弹出错误窗口!
请问各位大侠还有什么方法杀掉进程!
急求...
解决方案 »
- 用delphi如何控制DataMax I Class 打印条码
- CTRL+鼠标左键 不能自动跳转到单元文件
- 投了份简历给一家公司
- 初学delphi,请教小问题~。~谢啦!
- 如何在DBGridEh上得到鼠标按下时的当前所在列号,答案出来马上给分
- 如何将variant类型的赋值给某个变量
- 关于基于UDP协议的通信!老是会造成网络堵塞!WHY?
- 如何判断一个程序是否已死了(象2000中的任务管理器!)
- 使用上下键时,为何无法选择Edit1中的文本??
- 救命,客户的数据库被我干掉了,怎么恢复?
- 我的edit2中显示“10000002 油菜” 请问如何只将里面的10000002赋给edit1的Text属性?
- 请教在三层中如何让客户端不自动调去服务端
);
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapShotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
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(AFileName))
or (UpperCase(FProcessEntry32.szExeFile ) = UpperCase(AFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
end; AFileName是进程的名字,如WinWord.exe...
);
ParametersuExitCodeSpecifies the exit code for the process, and for all threads that are terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value. Return ValuesThis function does not return a value.
-------------------------
(1) 使主线程的进入点函数返回(最好使用这个方法)。
这是保证所有线程资源能够得到正确清除的唯一办法。
让主线程的进入点函数返回,可以确保下列操作的实现:
•该线程创建的任何C++对象将能使用它们的析构函数正确地撤消。
•操作系统将能正确地释放该线程的堆栈使用的内存。
•系统将进程退出代码(在进程的内核对象中维护)设为进入点函数返回值。
•系统将进程内核对象的使用计数递减1。
(2) 进程中的一个线程调用ExitProcess函数(应该避免使用这种方法)。
显式调用ExitProcess和ExitThread是程序不能正确将自己清除的常见原因。调用ExitThread时,进程将继续运行,但可能会泄漏内存或其他资源。
(3) 另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。
只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。
(4) 进程中的所有线程自行终止运行(这种情况几乎从未发生)。
如果进程中的所有线程全部终止运行,操作系统就认为没有理由继续保留进程的地址空间。
一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。
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的内容就是已知进程名
不就完了吗?