终止进程退出代码

Dav*_*veU 4 excel vba

我试图更好地理解一些流程 API,即 GetExitCodeProcess 和 TerminateProcess。我在互联网上找到了许多代码示例,但并不完全是我正在寻找的解释。

我知道这会给我一个进程的退出代码。

lResult = GetExitCodeProcess(hProcess, lExitCode)
Run Code Online (Sandbox Code Playgroud)

这将终止进程

lResult = TerminateProcess(hProcess, lExitCode)
Run Code Online (Sandbox Code Playgroud)

但是,似乎最后一个退出代码参数不必是在第一行中检索到的退出代码。事实上,我遇到过很多例子,其中0已被替换为退出代码。

lResult = TerminateProcess(hProcess, 0)
Run Code Online (Sandbox Code Playgroud)

我认为 lExitCode 是我必须提供给 TerminateProcess 函数的特定值,但显然情况并非如此 - 似乎几乎任何数字都可以使用。有人可以给我一个解释吗?

xmo*_*jmr 5

从 Excel 宏内部对各种外部应用程序进行脱壳的角度来看,基本上有两种情况:

1) 产生的进程正常终止

在此处输入图片说明

2)产生的进程异常终止(killed)

在此处输入图片说明

后一种情况应谨慎使用,因为

... TerminateProcess 函数用于无条件地使进程退出。如果使用 TerminateProcess 而不是 ExitProcess ,则动态链接库 (DLL) 维护全局数据状态可能会受到损害...

...进程不能阻止自己被终止

来源:MSDN:Windows ? 开发中心-桌面 ? 终止进程函数

另请注意,退出代码参数被视为输入

Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Run Code Online (Sandbox Code Playgroud)

并作为输出(ByRef)在

Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
Run Code Online (Sandbox Code Playgroud)

两个函数都遵循相同的成功/错误调用约定

返回值

如果函数成功,则返回值非零。如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError

(Visual Basic:应用程序应该调用 err.LastDllError 而不是 GetLastError)

来源:MSDN:TerminateProcess 函数GetExitCodeProcess 函数GetLastError 函数