delphi怎么关闭打开的exe文件。

时间:2021-12-11 02:13:23
用delphi打开了pj.exe的应用程序,但是没法关掉。
请各位帮忙。

15 个解决方案

#1


找进程,杀掉

#2


能具体点吗?

#3


网上流传的。


unit Tlhelp323;

interface

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);[Page]
  Result := GetLastError = ERROR_SUCCESS;
  end;
var
  hToken: Cardinal;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  result:=EnablePrivilege(hToken, 'SeDebugPrivilege', True);
  CloseHandle(hToken);
end;

end. 

#4


该回复于2010-11-15 09:04:44被版主删除

#5


有些进程别说提升权限,就算你注销计算机也不行,除非关机。

#6


引用 5 楼 mwy654321 的回复:
有些进程别说提升权限,就算你注销计算机也不行,除非关机。

能不能说一个我来试一试?

#7


 
function ClosePid(Id:DWORD):Boolean;
var
  Process: THandle;
begin
  Process:= OpenProcess(PROCESS_ALL_ACCESS, False, ID);
  TerminateProcess(Process,0);
end;

#8


呵呵,用鼠标点击右上角的X按钮。

#9


查找进程,然后发消息WM_CLOSE

#10


3楼的已经有可行的代码了

#11


有些进程是是驱动级的,象360,卡巴斯基,等,你是杀不了的

#12


命令格式:ntsd -c q -p pid 
  命令范例: ntsd -c q -p 4 (结束System进程。)
记住是PID,不是进程名称,随便杀,什么进程都可以,卡巴,360这种随便搞

PID在任务管理器里选择列,PID打勾就可以看到了。

#13


百度了下,有进程名
命令格式:ntsd -c q -pn ***.exe (***.exe 为进程名,exe不能省)

#14


有一些高等级的进程, tskill和taskkill或许无法结束,那么我们还有一个更强大的工具,那就是系统debug级的ntsd.准确的说,ntsd是一个系统调试工具,只提供给系统开发级的管理员使用,但是对我们杀掉进程还是很爽的.基本上除了WINDOWS系统自己的管理进程,

ntsd几乎都可以杀掉

#15


thanks shuaialang

也非常感谢大家。

#1


找进程,杀掉

#2


能具体点吗?

#3


网上流传的。


unit Tlhelp323;

interface

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);[Page]
  Result := GetLastError = ERROR_SUCCESS;
  end;
var
  hToken: Cardinal;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  result:=EnablePrivilege(hToken, 'SeDebugPrivilege', True);
  CloseHandle(hToken);
end;

end. 

#4


该回复于2010-11-15 09:04:44被版主删除

#5


有些进程别说提升权限,就算你注销计算机也不行,除非关机。

#6


引用 5 楼 mwy654321 的回复:
有些进程别说提升权限,就算你注销计算机也不行,除非关机。

能不能说一个我来试一试?

#7


 
function ClosePid(Id:DWORD):Boolean;
var
  Process: THandle;
begin
  Process:= OpenProcess(PROCESS_ALL_ACCESS, False, ID);
  TerminateProcess(Process,0);
end;

#8


呵呵,用鼠标点击右上角的X按钮。

#9


查找进程,然后发消息WM_CLOSE

#10


3楼的已经有可行的代码了

#11


有些进程是是驱动级的,象360,卡巴斯基,等,你是杀不了的

#12


命令格式:ntsd -c q -p pid 
  命令范例: ntsd -c q -p 4 (结束System进程。)
记住是PID,不是进程名称,随便杀,什么进程都可以,卡巴,360这种随便搞

PID在任务管理器里选择列,PID打勾就可以看到了。

#13


百度了下,有进程名
命令格式:ntsd -c q -pn ***.exe (***.exe 为进程名,exe不能省)

#14


有一些高等级的进程, tskill和taskkill或许无法结束,那么我们还有一个更强大的工具,那就是系统debug级的ntsd.准确的说,ntsd是一个系统调试工具,只提供给系统开发级的管理员使用,但是对我们杀掉进程还是很爽的.基本上除了WINDOWS系统自己的管理进程,

ntsd几乎都可以杀掉

#15


thanks shuaialang

也非常感谢大家。