我被要求制作一个应用程序(在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;
答案 0 :(得分:0)
(代表OP发表答案)。
问题与代码无关。在IDE外部运行应用程序允许正确处理异常。