4

首先,在 perl也在这里)和Windows中找到一些关于退出代码的背景知识。

现在 - 当我在 Windows 上从 perl 脚本执行另一个进程时(我对方法qx/ open/ system/ exec/IPC::Run等持开放态度):

是否可以捕获0-范围之外的退出代码255

在 Windows 上,一个进程可以返回一个完整的(签名的)32 位退出代码,并且返回一些东西并不少见0x8...0...,即一些 COM 错误代码或类似的东西。

4

2 回答 2

6

是的,Win32::Process可以返回完整的签名 32 位退出代码。使用GetExitCode方法。但这有点棘手,因为返回值不是退出代码(它是Windows GetExitCodeProcess函数的返回值,表示函数成功或失败)。退出代码存储在您传递给方法的变量中。

use Win32::Process;
use Win32;

sub ErrorReport{
    print Win32::FormatMessage( Win32::GetLastError() );
}

my $ProcessObj;
Win32::Process::Create($ProcessObj,
                       "C:\\winnt\\system32\\notepad.exe",
                       "notepad temp.txt",
                       0,
                       NORMAL_PRIORITY_CLASS,
                       ".") or die ErrorReport();

$ProcessObj->Wait(INFINITE);
my $exitCode;
$ProcessObj->GetExitCode($exitCode) or die ErrorReport();
于 2011-07-22T07:48:22.753 回答
4

这是可能的,但并不简单。

Win32::API模块可以将 Windows API 公开给 Perl 脚本。使用它为GetExitCodeProcess函数创建代码引用,使用死程序的进程标识符调用它,然后解包结果。

于 2011-07-22T07:47:50.017 回答