2011-07-22 63 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創建代碼引用,用死程序的進程標識符調用它,然後解壓縮結果。

相關問題