0

我们的程序在某些情况下可能会挂起,有没有办法在不使用任务管理器的情况下通过 Windows 调用搜索和销毁您自己的程序。将其包含在程序本身中可能没有意义,但作为捆绑的东西没有人会看到。

执行此操作的最佳方法是什么,我需要挖掘多深才能停止我的程序以及我应该保持多浅以确保不会使操作系统崩溃?

4

6 回答 6

2

您可以创建一个 .bat 文件并将Taskkill命令放入其中以强制终止您的应用程序。该命令看起来像这样:

taskkill /f /im notepad.exe
于 2009-07-24T21:33:09.640 回答
1

尽管您可能应该修复它挂起的情况,但您可以让程序自行终止的一种方法是在您启动应用程序时生成一个新线程,并让该线程轮询应用程序并在必要时终止它。

在 Windows 中杀死一个线程。

于 2009-07-24T21:10:31.980 回答
1

一种选择是编写一个用作看门狗的 Windows 服务。您可以通过它的 .exename 找到您的程序,然后您需要一些方法来确定它是否挂起(例如一些简单的进程间通信甚至客户端/服务器的事情)并在必要时重新启动它。

不过,这几乎不是“没人会看到”。

于 2009-07-24T21:11:11.277 回答
1

您可以使用TerminateProcess终止进程。您需要使用EnumProcesses确定目标进程 ID ,然后调用OpenProcess以获取进程的句柄以终止它。

于 2009-07-24T21:24:59.283 回答
1

EnumProcesses()您可以使用该函数枚举正在运行的进程。这将让您搜索进程名称并获取 PID。使用 PID,您可以打开一个 HANDLE 到您需要调用TerminateProcess()以终止挂起的进程的进程。

MSDN上有一个如何使用的例子。EnumProcesses

一些伪代码可能类似于:

EnumProcesses(pidArray, sizeofArray, &bytesReturned);
for(int i=0; i < bytesReturned/sizeof(DWORD); i++) {
  if(getProcessName(pidArray[i]) == "ourProcess"){
    HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pidArray[i]);
    TerminateProcess(hProc, 0);
  }
}
于 2009-07-24T21:38:16.790 回答
0

从 sysinternals 的 pstools 实现一些东西怎么样?

于 2009-07-24T21:23:00.473 回答