我被要求做一個應用程序(在帕斯卡爾/德爾福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;
'try/except'是正確的解決方案。它處理COM/OLE錯誤就好了(在你的例子中,雖然缺少'except'關鍵字)。如果遇到問題,則必須在代碼中未顯示。請提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –
感謝您的回覆,我已經使用函數中的代碼片段更新了OP。 – BinaryAssault
你在IDE以外測試了嗎?儘管你可以在調試器的設置 –