2016-09-13 18 views
0

私は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を正しくキャッチできますか?

+0

Sigh。完全なMCVEを表示してください。 –

+0

ちょっと考えましたが、あなたはEOleExceptionsだけを捕まえています。 EOleExceptionの後に他の例外もキャッチするとどうなりますか? – GuidoG

+0

Windows API関数 "InitiateSystemShutdown"を使用してリモートコンピュータを再起動するのはなぜですか?関数が失敗した場合は、 "GetLastError"を実行すると、リモートコンピュータへの接続に失敗した可能性があります。 –

答えて

0

私はあなたが見ているのはSWbemLocator.ConnectServerで捕まえられている最初のチャンスの例外だと思うので、自分でそれを罠に掛けることはできません。私はこれらの状況下では戻り値がゼロであると考えています。これが正しい場合は、このようにコードを単純に調整することができます

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); 
     if assigned(WMIService) then 
     begin 
      ... 
     end; 
    except 
     // good idea to put this in anyway, but not relevant to action 
    end; 
end; 
+0

こんにちは@DSM、残念ながら、コードはWMIServiceを設定する以下になっていません。 WMIService:= SWbemLocator.ConnectServer(host、 'root \ CIMV2'、username、password);で失敗しています。また、私はそれがOLEvariant型のために割り当てられているかどうかを確認することはできません。コンパイラは型が互換性がないと訴える。 – BinaryAssault

0

問題は、アプリケーションではなくコンパイラによって発生します。コンパイラの外部のexeから直接アプリケーションを実行すると、ポップアップが抑制され、期待どおりに内部的にキャッチされます。

関連する問題