2016-07-22 6 views
0

Мне было предложено сделать приложение (в 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; 
+3

'try/except' - правильное решение. Он отлично справляется с ошибками COM/OLE (в ваших примерах отсутствует ключевое слово 'except', хотя). Если у вас проблемы, это должно быть в коде, который вы не показывали. Просьба указать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

+0

Спасибо за ответ, я обновил OP с помощью фрагмента кода из функции. – BinaryAssault

+2

Вы тестировали это вне среды IDE? IDE останавливается по умолчанию на исключениях, хотя вы можете сделать исключения для этого в настройках отладчика –

ответ

0

(Отправленный ответ от имени ОП).

Проблема не связана с кодом. Запуск приложения вне IDE разрешил правильное обращение к исключению.