Мне было предложено сделать приложение (в pascal/delphi 2007), которое можно использовать для перезагрузки удаленных компьютеров (работает XP) на основе пользовательского ввода. Я сделал аналогичную часть программного обеспечения в C# /. NET2.0. Я новичок в Pascal/Delphi, однако мне удалось перевести мой код по большей части. Системы, к которым это приложение будет работать, не всегда имеют .NET к сожалению.Локальные исключения WMI внутри Delphi
Чтобы определить, активен ли удаленный компьютер, я пытаюсь выполнить пинг. Пинг использует WMI для подключения к компьютеру, для которого требуется имя пользователя/пароль.
Есть ли лучший способ проверить, находится ли удаленная машина в сети? Я сделал исследование и пинг, кажется, лучший вариант в этом сценарии. К сожалению, удаленные компьютеры, которые я перезагружаю, имеют свои диски с защитой от записи, поэтому я не могу создать сценарий сервера/клиента.
Если удаленный компьютер не подключен к сети, приложение выдает исключение для Access Denied.
В 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;
Это привело к тому же, что и к исключению.
Я попытался реализовать универсальный обработчик исключений «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 останавливается по умолчанию на исключениях, хотя вы можете сделать исключения для этого в настройках отладчика –