私はDelphi 2007を使用して、ネットワーク接続されたコンピュータを再起動するアプリケーションを作成しています。WMIを使用したEOleExceptionのキャッチ
私は、通信していないマシンに接続しようとすると失敗するrebootMachineという名前のユニットを持っています。何らかの理由でオフラインになっている可能性のあるマシンを再起動しようとすると、この状態を処理できる必要があります。私は以下のコードを実行すると、それは私がtry/catchブロックを使用しようとするが、それは失敗した接続をキャッチされていないと私はなぜわからない
WMIService := SWbemLocator.ConnectServer(host, 'root\CIMV2', username, password);
で停止します。私が提示しているエラーは、 "RPCサーバーが利用できません"というメッセージでEOleExceptionを述べています。マシンがオンラインでないため、これは当てはまります。その後、アドレス000000000のアクセス違反メッセージが表示されます。コンピュータがオンラインの場合、同じコードが有効です。
function rebootMachine(host: string; username: string; password: string)
: Integer;
const
wbemFlagForwardOnly = $00000020;
var
WMIService : OLEVariant;
WbemObjectSet: OLEVariant;
WbemObject : OLEVariant;
SWbemLocator : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
mResult : Integer;
begin
try
CoInitialize(nil); // Initializes the COM library on the current thread
mResult := -1;
// create our wmi object
SWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
// connect remotely to the machine
WMIService := SWbemLocator.ConnectServer(host, 'root\CIMV2', username, password);
....
except
on E: EOleException do
begin
LogFiles.NewException(E);
mResult := E.ErrorCode;
result := mResult;
end;
end;
end;
問題は、どうすればEOleExceptionを正しくキャッチできますか?
Sigh。完全なMCVEを表示してください。 –
ちょっと考えましたが、あなたはEOleExceptionsだけを捕まえています。 EOleExceptionの後に他の例外もキャッチするとどうなりますか? – GuidoG
Windows API関数 "InitiateSystemShutdown"を使用してリモートコンピュータを再起動するのはなぜですか?関数が失敗した場合は、 "GetLastError"を実行すると、リモートコンピュータへの接続に失敗した可能性があります。 –