我写这封信从通过一个Perl 5驱动程序Internet Explorer的一些代码Win32::OLE
,和我在寻找各种方法来转换是通过事件(如发送回Perl程序数字状态/错误代码NavigateError
)成稍微更人类可读的形式。
是否有某种库函数是转换即0x800C0005L或-2146697211到"INET_E_RESOURCE_NOT_FOUND"
或一些更可读?
我曾尝试Win32::FormatMessage()
但似乎只适用于非应用程序特定的错误条件下工作。
更新:这里是澄清一些示例代码。 下面的一些测试输出被示出。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::HiRes qw(sleep time);
use Win32::OLE qw(EVENTS);
use Win32::OLE::Variant;
$|++;
sub ie_browse {
my $url = shift;
my $ie = Win32::OLE->new('InternetExplorer.Application') or die;
Win32::OLE->WithEvents($ie,
sub {
my ($obj, $event, @args) = @_;
given ($event) {
when ('NavigateComplete2') {
push @extra,
'url='.($args[1]->As(VT_BSTR));
say "$event: @extra";
}
when ('NavigateError') {
push @extra,
'url='.($args[1]->As(VT_BSTR)),
'statuscode='.($args[3]->As(VT_I4));
say "$event: @extra";
}
}
}, 'DWebBrowserEvents2');
Win32::OLE->SpinMessageLoop;
$ie->{visible} = 1;
Win32::OLE->SpinMessageLoop;
$ie->Navigate2($url);
Win32::OLE->SpinMessageLoop;
while(1) {
Win32::OLE->SpinMessageLoop;
sleep(0.1);
}
}
ie_browse $ARGV[0];
下面是一些输出两个取尝试。 获取堆栈溢出页面是成功的,当然。
C:\Documents and Settings\nobody\Desktop>perl ie.pl http://stackoverflow.com/
NavigateComplete2: url=http://stackoverflow.com/
Terminating on signal SIGINT(2)
但example.invalid
不存在。
C:\Documents and Settings\nobody\Desktop>perl ie.pl http://example.invalid/
NavigateError: url=http://example.invalid/ statuscode=-2146697211
NavigateComplete2: url=http://example.invalid/
Terminating on signal SIGINT(2)
我感兴趣的转向已传递回一些有用的数值(-2146697211)。 这不是一个OLE错误本身,而是通过Internet浏览器COM对象发出信号的错误条件。