65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Win32 API 终止应用程序

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.39/5 (8投票s)

2007年5月28日

2分钟阅读

viewsIcon

105959

downloadIcon

3537

它会结束应用程序。程序员需要指定程序的 EXE 名称,然后此应用程序将从当前运行的进程中枚举该应用程序,并检索 ThreadID 和 Process Handle。使用这些信息,应用程序将终止该应用程序。

引言

我们可以在控制台或对话框应用程序中使用它。为此,您需要在应用程序中添加一个头文件“Tlhelp32.h”。 它会结束程序中指定的进程,它可能是自身或系统中运行的任何其他应用程序。 如果应用程序在关闭时出现问题或者存在任何内存泄漏,那么此应用程序可能会有所帮助。

使用代码

******************** 方法一:查找并结束进程 *****************

此代码分为两个阶段。

1. 我们正在枚举系统进程。 我们获取所有进程名称并进行比较。如果我们找到相同的名称,这意味着我们找到了正在运行的应用程序,我们可以检索该应用程序的 Handle 和 ThreadID。

 
 /////////////////////////////////////////////////////////////////////////
 // This part of code is enumerating process.
 /////////////////////////////////////////////////////////////////////////
  HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  DWORD dwsma = GetLastError();
  DWORD dwExitCode = 0;
  PROCESSENTRY32  procEntry={0};
  procEntry.dwSize = sizeof( PROCESSENTRY32 );
  Process32First(hndl,&procEntry);
  do
  {
    if(!strcmpi(procEntry.szExeFile,"wweb32.exe"))
    {
        AfxMessageBox("Application found");
    break;
    }
    //cout<<"Running Process "<<"          "<<procEntry.szExeFile<<endl;
  }while(Process32Next(hndl,&procEntry));
 

2. 找到进程后,我们将检索该进程的 processID 和 ThreadID。如果我们有该进程的详细信息,那么我们可以使用 TerminateProcess API 结束该进程。 但是,如果没有访问权限,此 API 可能会失败,因此我们需要首先使用 OpenProcess API 获取访问权限,并且该 API 的第一个参数必须为 "PROCESS_ALL_ACCESS"。 现在我们拥有进程的完全访问权限,然后我们可以执行 TerminateProcess API。 这将终止或结束我们系统中的进程。

 
  HANDLE hHandle;
  hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,procEntry.th32ProcessID);
  
  ::GetExitCodeProcess(hHandle,&dwExitCode);
  ::TerminateProcess(hHandle,dwExitCode);
 

* * * * * * * * * * * * * * 方法二:结束自身应用程序 * * * * * * * * * * * *

为了结束自身应用程序,我们不需要枚举上面给出的进程。 我们可以使用 API GetCurrentProcessId 来做到这一点。 如果我们想结束系统中运行的其他进程,则需要使用枚举方法。 这是我们可以用来检索 ProcessId 的一种方法。 一旦我们有了 ProcessId,我们就有了对该进程的控制权。 这是您可以结束应用程序的代码。 您只需要将这 5 行代码粘贴到您的应用程序中即可。

  HANDLE hHandle;
  DWORD dwExitCode = 0;
  hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,GetCurrentProcessId());
  ::GetExitCodeProcess(hHandle,&dwExitCode);
  ::TerminateProcess(hHandle,dwExitCode);

关注点

如果关闭时出现问题,应用程序可以自行结束。 对于那些尝试多次修复关闭应用程序错误但仍然无法在没有错误的情况下关闭应用程序的开发人员来说,这很有趣。 这是对他们来说最好的解决方案之一。

这与从任务管理器强制结束进程的方式相同。 例如,如果某个应用程序出现问题,那么我们需要打开任务管理器并强制终止它。

如果您有任何问题或需要我的帮助,可以通过电子邮件与我联系:cha1202001@yahoo.com

© . All rights reserved.