Perl 5プログラムからInternet Explorerを起動するためのコードをWin32::OLE
で作成しています。数字のステータス/エラーコードを変換する方法を探しています。イベントを介したPerlプログラム(NavigateError
など)を人間が読める形式に変換します。Internet ExplorerのCOMオートメーション:数字のエラーコードを文字列に変換する
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];
ここでは2回のフェッチ試行のための出力を示します。もちろん、スタックオーバフロー ページをフェッチすることは成功です。
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 Explorer COMオブジェクトによってエラー状態 が通知されます。
@hilluありがとう。私はまだこれで悩まされています。どこかのAPIが必要です。 –