В моем приложении Delphi я звоню IcmpSendEcho()
с icmp.dll
.Код работал хорошо в течение многих лет и для нескольких пользователей на разных платформах.Тем не менее, у меня есть один пользователь, который возвращает вызов Отказано в доступе.
Я запустил Process Monitor, но там ничего не видно.Я проверил все очевидные права доступа, я даже использовал браузер DLL, чтобы убедиться, что их DLL содержит соответствующую функцию экспорта (браузер DLL не имеет проблем с доступом к DLL) !!
Я собралавтономное тестовое приложение для этого клиента, код ниже:
function TForm40.PingDiagnose(InetAddress: string): boolean;
var
IPAddress: string;
Handle: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: array [1 .. 1280] of byte;//try a stupid size in case that's the problem
begin
result := false;
Memo1.lines.add('Attempting to get handle on icmp.dll');
Handle := IcmpCreateFile;
if Handle = INVALID_HANDLE_VALUE then
begin
Memo1.lines.add('Failed to get handle on icmp.dll');
Exit;
end;
try
IPAddress := '';
Memo1.lines.add(format('Attempting to resolve IP address for %s',[InetAddress]));
IPAddress := GetIPAddress(InetAddress);
Memo1.lines.add(format('IP address returned %s',[IPAddress]));
if (IPAddress <> '') then // if internet is down, IPAddress could be an empty string
begin
with TIdStackWindows.create do
begin
TranslateStringToTInAddr(IPAddress, InAddr, Id_IPv4);
free;
end;
Memo1.lines.add('Attempting to call IcmpSendEcho on icmp.dll');
DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 1280, 1000);
Memo1.lines.add(format('Result returned from call: %d',[DW]));
if DW=0 then
begin
Memo1.lines.add(format('Error number: %d - %s',[GetLastError, SysErrorMessage(GetLastError)]));
end;
result := (DW <> 0);
end;
finally
IcmpCloseHandle(Handle);
end;
end;
Поэтому я предполагаю, что именно то, что IcmpSendEcho()
делает дальше, вызывает ошибку.
Я не могу найти ничего полезного через Google, поэтому есть какие-либо идеи относительно того, что может происходить, или как я могу "отладить" это дальше?