2016-07-22 71 views
0

我被要求做一個應用程序(在帕斯卡爾/德爾福2007),可用於重新啓動基於用戶輸入遠程計算機(運行XP)。我在C#/ .NET2.0中製作了一個類似的軟件。我是Pascal/Delphi的新手,但是我設法翻譯了我的代碼。不幸的是,這個應用程序運行的系統並不總是有.NET。捕獲WMI例外內部德爾福

要確定遠程機器是否處於活動狀態,我嘗試ping。 ping使用WMI連接到需要用戶名/密碼的計算機。

是否有更好的方法來測試,如果遠程計算機在網絡上?我已經完成了研究,並且在這種情況下ping似乎是最好的選擇。不幸的是,我重新啓動的遠程機器的驅動器被寫保護,所以我無法創建服務器/客戶端場景。

如果遠程機器未在網絡上連接時,應用程序將引發拒絕訪問異常。

在C#中,我可以做沿着

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

在Delphi線的東西,我嘗試以下操作:

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; 

這導致了相同的異常。

我確實嘗試推行全民「包羅萬象」異常處理程序。這工作,但記錄錯誤後,它會崩潰的應用程序。我沒有進一步追求這一點。日誌記錄功能在通用異常處理程序之外正常工作。

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以外測試了嗎?儘管你可以在調試器的設置 –

回答

0

(發表回覆代表OP)。

問題不相關的代碼。在IDE外運行應用程序可以正確處理異常。