ユーザー入力に基づいてリモートマシンを再起動するために使用できるアプリケーション(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;
'try/except'が正しい解決策です。これはCOM/OLEエラーをうまく処理します(あなたの例では、 'except'キーワードがありません)。問題がある場合は、表示されていないコードでなければなりません。 [最小限の完全で検証可能な例]を提供してください(http://stackoverflow.com/help/mcve)。 –
返信いただきありがとうございます、私は機能からコードスニペットでOPを更新しました。 – BinaryAssault
IDEの外でこれをテストしましたか?デバッガの設定では、デバッガの設定で例外を発生させることができますが、IDEはデフォルトで例外を停止します。 –