delphi 关闭进程方法

Uses
   Windows ,
   SysUtils ,
   Tlhelp32 ;

Function KillTask ( ExeFileName : String ): Integer ; //关闭进程
Function EnableDebugPrivilege : Boolean ; //提升权限
Function FindProcessId ( ExeFileName : String ): THandle ; //查找进程

Implementation

Function FindProcessId ( ExeFileName : String ): THandle ;
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 ( FProcessEntry32 . szExeFile ) = UpperCase ( ExeFileName ) Then
     Begin
       result := FProcessEntry32 . th32ProcessID ;
       break ;
     End ;
     ContinueLoop := Process32Next ( FSnapshotHandle , FProcessEntry32 ) ;
   End ;
   CloseHandle ( FSnapshotHandle ) ;
End ;

Function KillTask ( ExeFileName : String ): Integer ;
Const
   PROCESS_TERMINATE = $0001 ;
Var
   ContinueLoop : boolean ;
   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 ;
   CloseHandle ( FSnapshotHandle ) ;
End ;

//但是对于服务程序,它会提示"拒绝访问".其实只要程序拥有Debug权限即可:

Function EnableDebugPrivilege : Boolean ;

Function EnablePrivilege ( hToken : Cardinal ; PrivName : String ; bEnable : Boolean ): Boolean ;
   Var
     TP : TOKEN_PRIVILEGES ;
     Dummy : Cardinal ;
   Begin
     TP . PrivilegeCount := 1 ;
     LookupPrivilegeValue ( Nil , pchar ( PrivName ), TP . Privileges [ 0 ]. Luid ) ;
     If bEnable Then
       TP . Privileges [ 0 ]. Attributes := SE_PRIVILEGE_ENABLED
     Else
       TP . Privileges [ 0 ]. Attributes := 0 ;
     AdjustTokenPrivileges ( hToken , False , TP , SizeOf ( TP ), Nil , Dummy ) ;
     Result := GetLastError = ERROR_SUCCESS ;
   End ;
Var
   hToken : Cardinal ;
Begin
   OpenProcessToken ( GetCurrentProcess , TOKEN_ADJUST_PRIVILEGES , hToken ) ;
   result := EnablePrivilege ( hToken , 'SeDebugPrivilege' , True ) ;
   CloseHandle ( hToken ) ;
End ;

End .

使用的时候先 EnableDebugPrivilege提升权限,然后 KillTask ( ExeFileName : String )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种集成开发环境(IDE),用于创建Windows应用程序。在Delphi中,可以使用编程语言(如Object Pascal)编写代码来处理各种任务,包括操作系统进程的管理。 要结束一个进程,可以使用Delphi中的一些函数和类来实现。其中一个方法是使用`TerminateProcess`函数,该函数会终止指定进程的执行。可以使用进程进程ID(PID)来标识要结束的进程。 以下是在Delphi中结束进程的简单示例代码: ```pascal {$APPTYPE CONSOLE} uses SysUtils, Windows; procedure TerminateProcessByName(const AProcessName: string); var ProcessID: DWORD; ProcessHandle: THandle; begin // 根据进程名称查找进程ID ProcessID := GetProcessByName(AProcessName); // 打开进程句柄 ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcessID); if ProcessHandle <> 0 then begin // 终止进程 TerminateProcess(ProcessHandle, 0); // 关闭进程句柄 CloseHandle(ProcessHandle); WriteLn('进程已成功终止!'); end else WriteLn('找不到该进程!'); end; begin try // 结束名为"zishen.exe"的进程 TerminateProcessByName('zishen.exe'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. ``` 上述代码中,`TerminateProcessByName`过程接收进程名称作为参数,通过`GetProcessByName`函数查找进程ID,然后使用`OpenProcess`打开进程句柄。接着,`TerminateProcess`函数用于终止进程,`CloseHandle`关闭进程句柄。最后,显示终止结果。 需要注意的是,在使用`TerminateProcess`函数时需要小心,因为它会强制终止进程而不会进行任何清理工作。因此,建议在终止进程之前先和相关进程通信,并进行必要的资源释放。此外,必须谨慎使用这种操作,以防止意外关闭系统关键进程或其他危险情况的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值