2011-07-22 112 views
4

首先,找到一些关于退出码in perlalso here)和on Windows的背景。是否有可能用perl处理大于255的退出码?

现在 - 当我从一个Perl脚本执行另一个进程(我为的方法公开,qx/open/system/exec/IPC::Run等)在Windows

是否有可能捕获在0 - 255范围之外的退出代码?

在Windows上,一个进程可以返回一个完整的(签约)32位退出代码,它不是那么不凡有什么回报0x8...0...,就是一些COM错误代码或诸如此类。

回答

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(); 
+0

优秀的例子。谢谢! (现在唯一的问题显然是Wait(INFINITE)有点没有反应:-) –

4

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

Win32::API模块可以将Windows API暴露给Perl脚本。使用它为the GetExitCodeProcess function创建代码引用,用死程序的进程标识符调用它,然后解压缩结果。

相关问题