使用Delphi在内部捕获WMI异常

时间:2016-07-22 03:56:37

标签: delphi exception-handling try-catch wmi

我被要求制作一个应用程序(在pascal / delphi 2007中),可用于根据用户输入重启远程计算机(运行XP)。我在C#/ .NET2.0中制作了类似的软件。我是Pascal / Delphi的新手,但是我设法翻译我的代码。不幸的是,运行此应用程序的系统并不总是具有.NET。

要确定远程计算机是否处于活动状态,我尝试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;

虽然这种类型的try / except在代码的大多数其他部分都有用,但它似乎并不能处理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;

1 个答案:

答案 0 :(得分:0)

(代表OP发表答案)。

问题与代码无关。在IDE外部运行应用程序允许正确处理异常。