GetExitCodeProcess
看似可以,但是仔细看MSDN,有这么一句话:“
WarningIf a process happens to return STILL_ACTIVE (259) as an error code, applications that test for this value could end up in an infinite loop.” 很明显,我们不能保证一个进程不会返回一个STILL_ACTIVE (259)做为退出码,也就是说GetExitCodeProcess返回了STILL_ACTIVE 并不代表这个进程还没有结束。此时该进程可能已经结束(并返回259做为退出码)或者没有结束。此路不通。
WaitForSingleObject
这才是正途。进程本质上是一个”内核对象“,可以用Wait系列的API函数来等待其结束。其实我们做多线程同步时也用过WaitFor....只不过那时是wait一个线程句柄。
delphi中实现如下:
unit SysUtils2;
{作者: 袁晓辉 blog.csdn.net/uoyevoli}
interface
uses Windows;
//返回值代表是否成功
//如果返回True,HasExited 代表进程是否已经结束
function ProcessHasExited(ProcessHandle: THandle; out HasExited: Boolean): Boolean;
implementation
function ProcessHasExited(ProcessHandle: THandle; out HasExited: Boolean): Boolean;
var
WaitResult: DWORD;
begin
Result :=False;
WaitResult := WaitForSingleObject(ProcessHandle, 0);
Result := WaitResult <> WAIT_FAILED;
HasExited := WaitResult = WAIT_OBJECT_0;
end;
end.
分享到:
相关推荐
通过进程句柄取得PID的软件源码,是针对Windows操作系统环境下的一种高级编程技巧,主要应用于VB(Visual Basic)开发环境中。这一技术的核心在于利用Windows NT内核提供的API函数`ZwQueryInformationProcess`来获取...
此函数接收进程句柄和退出代码作为参数,成功执行后,目标进程将被立即停止。 ```delphi function TerminateProcess(hProcess: THandle; uExitCode: DWORD): BOOL; stdcall; external 'kernel32.dll' name '...
在这个示例中,我们首先通过`GetProcessIdByName`函数找到目标进程的ID,然后调用`OpenProcess`以获取进程句柄。接着,我们调用`EndProcess`来结束进程,并确保最后关闭进程句柄。 需要注意的是,关闭进程需要相应...
本文将深入探讨“演示ClientSocket反复连接进程句柄数不变”这个主题,以及如何解决由此引发的问题,如句柄数增加、系统资源耗尽和死机。 首先,让我们理解什么是ClientSocket。ClientSocket是Delphi中的一个组件,...
`TerminateProcess`接受两个参数:进程句柄和退出码。通常,退出码设置为0表示正常退出。 ```delphi if ProcessHandle <> 0 then TerminateProcess(ProcessHandle, 0); ``` 4. **错误处理**: 在实际操作中,我们...
至于查杀进程,Delphi提供`TerminateProcess`函数,该函数接受进程句柄和退出码,可以强制终止指定的进程。然而,需要注意的是,无权限或者进程正在执行关键任务时,终止进程可能会导致系统不稳定,因此在实际操作前...
3. 调用`TerminateProcess`:传入进程句柄和一个退出码,这将立即结束目标进程的执行。 4. 错误处理:在尝试操作后,应该检查返回值,确保进程成功终止,如果失败,可以用`GetLastError`获取错误代码。 在实际的...
这个函数接受两个参数,一个是进程句柄,另一个是退出代码(通常设为0)。示例代码如下: ```delphi function TerminateProcess(hProcess: THandle; uExitCode: DWORD): Boolean; stdcall; external 'kernel32.dll...
具体来说,我们可以调用 `OpenProcess` 和 `TerminateProcess` 这两个函数来获取进程句柄并结束它。 1. **OpenProcess 函数**:此函数用于获取对指定进程的访问权限。它的原型如下: ```delphi function ...
4. **杀死进程**:当需要结束某个进程时,首先需要通过`OpenProcess`函数获取目标进程的句柄,然后调用`TerminateProcess`函数,传入进程句柄和退出状态码,即可结束指定进程。请注意,这一步骤需要足够的权限,否则...
- `TerminateProcess` 使用进程句柄和退出码作为参数。当调用此函数时,指定的进程将立即被强制停止,所有线程都将被终止,且不会有机会执行任何清理操作。 - 退出码通常用来表示进程结束的原因,但在这个强制结束...
`OpenProcess` 需要进程ID作为参数,返回一个进程句柄。然后,`TerminateProcess` 使用这个句柄和一个退出码来结束指定进程。需要注意的是,只有拥有足够权限的进程才能关闭其他进程,这通常需要`PROCESS_TERMINATE`...
它接受一个进程句柄和退出码作为参数: ```delphi function TerminateProcess(hProcess: HANDLE; uExitCode: DWORD): BOOL; stdcall; ``` 3. **GetLastError**: 当函数调用失败时,可以使用此函数获取错误代码...
结束进程通常需要调用`TerminateProcess`函数,该函数需要进程句柄和退出码作为参数。首先,你需要确保有权限结束目标进程,这通常需要调用`OpenProcess`函数并传入适当的访问权限(如`PROCESS_TERMINATE`)。然后,...
- 其中`hProcess`参数是需要终止的进程的句柄,`uExitCode`是退出代码。 3. **GetCurrentProcess和GetCurrentProcessId**: - `GetCurrentProcess`函数返回当前进程的句柄,`GetCurrentProcessId`函数返回当前...
该函数接受进程句柄和退出代码,其中退出代码通常是0,表示正常退出。 以下是一个简单的Delphi代码示例: ```delphi uses SysUtils, Windows; function CloseExternalProcess(ProcName: string): Boolean; var ...
它通过指定进程的句柄和退出代码来结束进程。使用这个函数时需谨慎,因为它不会释放进程所占用的资源,可能导致数据丢失。 4. **源码解析**: 实例中的源码可能包括以下关键部分: - 使用`ShellExecute`函数的...
通过查看源码,我们可以学习到如何在 Delphi 7 中有效地实现进程间通信,这对于理解和优化多进程应用程序的性能和协同工作至关重要。同时,这也是 Windows API 编程的一个基础实践,有助于提升开发者对系统级编程的...
总结来说,"结束程序"在Delphi中涉及到的关键技术包括进程ID的获取、进程句柄的打开、以及使用`TerminateProcess`函数来结束进程。开发者需要对Windows API有深入理解,同时注意权限控制和错误处理,以确保程序的...
这个函数接受进程句柄和退出代码作为参数,成功执行后,进程会立即停止运行。 4. **读取进程的物理路径**:要获取进程的可执行文件路径,可以使用`QueryFullProcessImageName`或`NtQueryInformationProcess`等API。...