2016-07-22 16 views
0

ユーザー入力に基づいてリモートマシンを再起動するために使用できるアプリケーション(pascal/delphi 2007)を作成するように求められました。私はC#/。NET2.0で同様のソフトウェアを作った。私はPascal/Delphiの新機能ですが、大部分のコードを翻訳することができました。このアプリケーションが実行されるシステムは、残念なことに.NETを持っているとは限りません。Delphiの内部でWMI例外をキャッチ

リモートマシンがアクティブであるかどうかを判断するために、私はpingを試みます。 pingはWMIを使用してコンピュータに接続します。ユーザー名とパスワードが必要です。

リモートマシンがネットワーク上にあるかどうかをテストする良い方法はありますか?私は研究を行い、このシナリオではpingが最善の策だと思われます。残念ながら、再起動しているリモートマシンは、ドライブが書き込み禁止になっているため、サーバー/クライアントのシナリオを作成できません。

リモートマシンがネットワークに接続されていない場合、アプリケーションはアクセス拒否の例外をスローします。 C#ので

、私はDelphiで

try { 
    //WMI code to connect to remote machine 
} 
catch (Exception Except) 
{ 
    WrteExceptionToLog(Except); 
} 

の線に沿って何かを行うことができ、私は次のことを試みた:

try 
    //WMI code to connect to remote machine 
except 
    on E: Exception do 
    WrteExceptionToLog(E); 
end; 

のそのタイプは他のほとんどの部分で作品を除いて/しようとしますがコードはWMI呼び出しを処理していないようです。それは例外をキャッチせず、EOleExceptionとしてキャッチするコンパイラに直接渡されます。私は試してみましたが、私は試しました。

try 
    //WMI code to connect to remote machine 
except 
    on E: EOleException do 
    WrteExceptionToLog(E); 
end; 

これは例外と同じ結果になりました。

私は普遍的な「catch-all」例外ハンドラを実装しようとしました。これはうまくいきましたが、エラーを記録した後、アプリケーションがクラッシュします。私はこれ以上追求しなかった。ロギング機能は、ユニバーサル例外ハンドラの外部で正常に動作します。

function pingMachine(const Address: string; Retries, BufferSize: Word): Integer; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService : OLEVariant; 
    FWbemObjectSet: OLEVariant; 
    FWbemObject : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 
    i    : Integer; 
    mResult  : Integer; 
    PacketsReceived: Integer; 
    Minimum  : Integer; 
    Maximum  : Integer; 
    Average  : Integer; 
    test: Integer; 
begin 
    PacketsReceived := 0; 
    Minimum   := 0; 
    Maximum   := 0; 
    Average   := 0; 

    mResult := -1; 

    try 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 

    //WMI exception below when remote machine is offline 
    FWMIService := FSWbemLocator.ConnectServer(Address, 'root\CIMV2', 
        'USERNAME', 'PASSWORD'); 

    //code to do the actual ping... 

    except 
    on E: EOleException do 
    begin 
     LogFiles.NewException(E); 
    end; 

    on E: Exception do 
    begin 
     LogFiles.NewException(E); 
    end; 
    end; 
+3

'try/except'が正しい解決策です。これはCOM/OLEエラーをうまく処理します(あなたの例では、 'except'キーワードがありません)。問題がある場合は、表示されていないコードでなければなりません。 [最小限の完全で検証可能な例]を提供してください(http://stackoverflow.com/help/mcve)。 –

+0

返信いただきありがとうございます、私は機能からコードスニペットでOPを更新しました。 – BinaryAssault

+2

IDEの外でこれをテストしましたか?デバッガの設定では、デバッガの設定で例外を発生させることができますが、IDEはデフォルトで例外を停止します。 –

答えて

0

(OPに代わって投稿答え)。

問題はコード関連ではありませんでした。 IDEの外でアプリケーションを実行すると、例外が正しく処理されました。