2009-08-25 31 views
1

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オブジェクトによってエラー状態 が通知されます。

+0

@hilluありがとう。私はまだこれで悩まされています。どこかのAPIが必要です。 –

答えて

4

更新:

package Win32::WebBrowserControl::ErrorMnemonics; 

use strict; 
use warnings; 

my %lookup; 

sub import { 
    my $class = shift; 
    while (my $x = <DATA>) { 
     my ($mnemonic, $code) = ($x =~ m{ 
      ^(INET_E_[A-Z_]+) 
      [ ] 
      \(
       0x[[:xdigit:]]+L 
       [ ] or [ ] 
       (-[[:digit:]]+) 
      \) 
     }x) or next; 
     $lookup{$code} = $mnemonic; 
    } 
} 

sub lookup { 
    my $self = shift; 
    return $lookup{shift()}; 
} 

1; 
__DATA__ 
INET_E_INVALID_URL (0x800C0002L or -2146697214) 
INET_E_NO_SESSION (0x800C0003L or -2146697213) 
INET_E_CANNOT_CONNECT (0x800C0004L or -2146697212) 
INET_E_RESOURCE_NOT_FOUND (0x800C0005L or -2146697211) 
INET_E_OBJECT_NOT_FOUND (0x800C0006L or -2146697210) 
INET_E_DATA_NOT_AVAILABLE (0x800C0007L or -2146697209) 
INET_E_DOWNLOAD_FAILURE (0x800C0008L or -2146697208) 
INET_E_AUTHENTICATION_REQUIRED (0x800C0009L or -2146697207) 
INET_E_NO_VALID_MEDIA (0x800C000AL or -2146697206) 
INET_E_CONNECTION_TIMEOUT (0x800C000BL or -2146697205) 
INET_E_INVALID_REQUEST (0x800C000CL or -2146697204) 
INET_E_UNKNOWN_PROTOCOL (0x800C000DL or -2146697203) 
INET_E_SECURITY_PROBLEM (0x800C000EL or -2146697202) 
INET_E_CANNOT_LOAD_DATA (0x800C000FL or -2146697201) 
INET_E_CANNOT_INSTANTIATE_OBJECT (0x800C0010L or -2146697200) 
INET_E_REDIRECT_FAILED (0x800C0014L or -2146697196) 
INET_E_REDIRECT_TO_DIR (0x800C0015L or -2146697195) 
INET_E_CANNOT_LOCK_REQUEST (0x800C0016L or -2146697194) 
INET_E_USE_EXTEND_BINDING (0x800C0017L or -2146697193) 
INET_E_TERMINATED_BIND (0x800C0018L or -2146697192) 
INET_E_INVALID_CERTIFICATE (0x800C0019L or -2146697191) 
INET_E_CODE_DOWNLOAD_DECLINED (0x800C0100L or -2146696960) 
INET_E_RESULT_DISPATCHED (0x800C0200L or -2146696704) 
INET_E_CANNOT_REPLACE_SFP_FILE (0x800C0300L or -2146696448) 
INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY (0x800C0500L or -2146695936) 
INET_E_CODE_INSTALL_SUPPRESSED (0x800C0400L or -2146696192) 
:あなたはこのリストを解析することによって、モジュールを作成することができ

 
INET_E_INVALID_URL (0x800C0002L or -2146697214) 
INET_E_NO_SESSION (0x800C0003L or -2146697213) 
INET_E_CANNOT_CONNECT (0x800C0004L or -2146697212) 
... 

コメントの光では、私はあなたがNavigateErrorイベントにMicrosoftのドキュメントを探していると信じて

OLE関連のエラーについては、のドキュメントを参照してください。

Win32::OLE->LastError()

LastError()クラスメソッドは 最後に記録されたOLEエラーを返します。これは 数値コンテキストで という数値を返し、文字列コンテキストでは がエラーメッセージを返します。 変数のような の2つの値です。エラー の番号は符号付きHRESULTの値です。 HRESULT(ERROR)関数 を使用して、符号なし16進数 を符号付きHRESULTに変換してください。

+0

私が探しているのは、OLE関連のエラーコードではありません。 – hillu

+0

+1は、ドキュメントから定数を生成するためのアイデアです。 – hillu

関連する問題